Complete the following Lodash exercises. The goal is to become really good at
functional programming paradigm (e.g., _.map, _.filter, _.all, _.any ...etc) and
a number of really useful Lodash methods (e.g., _.find, _.pluck ... etc).
solution blockfor/while loop is allowedFamiliarity with programming in this way will not only make you a super productive programmer but also will pave the way for you to learn MapReduce and MongoDB.
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}]4
4
// Here we just need to count the number of elements in the data araay return data.length
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}][ "John", "Mary", "Joe", "Ben" ]
[ "John", "Mary", "Joe", "Ben" ]
// Here we operate on every element of the data array (so no filter is // necessary) and we return the property value of the name: field // NOTE - _.map returns an array of values for each element in Collection while // _.filter returns an array of all elements for which predicate is true return _.map(data, function(d) { return d.name })
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}][ "John", "Joe" ]
[ "John", "Joe" ]
// Here we filter based on if the property value of name: field starts with the letter 'J' // Since filter returns the data array element that for which the test is true we // pluck out the resulting value of the name: field from each returned array element return _.pluck(_.filter(data, function(d) { return _.startsWith(d.name, 'J') }), 'name')
[{name: 'John'}, {name: 'John'}, {name: 'John'}, {name: 'Ben'}]3
3
// Here we use filter with the shorthand _.matches notation to pick out which name: fields // are of the property value 'John' and use _.size to count number of returned array elements return _.size(_.filter(data, _.matches({'name': 'John'})))
[{name: 'John Smith'}, {name: 'Mary Kay'}, {name: 'Peter Pan'}, {name: 'Ben Franklin'}][ "John", "Mary", "Peter", "Ben" ]
[ "John", "Mary", "Peter", "Ben" ]
// Here we use map since operating on every data array element with a nested // splitting of the name: property value, returning the first string (first name) of value return _.map(data, function(d) { return _.first(d.name.split(' ')) })
[{name: 'John Smith'}, {name: 'Mary Smith'}, {name: 'Peter Pan'}, {name: 'Ben Smith'}][ "John", "Mary", "Ben" ]
[ "John", "Mary", "Ben" ]
// Here we first filter the data to determine which array elements include // the string 'Smith', then we used the filtered array result as an input // to _.map which iterates over and pulls out (_.splits) the first name of // returned filtered array. FIXME: This most likely can be improved var f_data = _.filter(data, function(d) { if (_.includes(d.name, "Smith")) { return 1 } }) return _.map(f_data, function(f) { return _.first(f.name.split(' ')) })
[{name: 'John Smith'}, {name: 'Mary Kay'}, {name: 'Peter Pan'}][
{
"name": "Smith, John"
},
{
"name": "Kay, Mary"
},
{
"name": "Pan, Peter"
}
][
{
"name": "Smith, John"
},
{
"name": "Kay, Mary"
},
{
"name": "Pan, Peter"
}
]return _.map(data, function(d) { return {'name': _.last(d.name.split(' ')) + ', ' + _.first(d.name.split(' '))} })
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]1
1
// Here we use the _.filter shorthand _.matches notation to find all data // array elements that have the gender: value of 'f' and count with _.size return _.size(_.filter(data, {gender: 'f'}))
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]2
2
// Filter to find males (gender: 'm'); Filter to find names: that include Smith // _map to iterate result and find last names of 'Smith' var males = _.filter(data, {gender: 'm'}) var names = _.filter(males, function(d) { if(_.includes(d.name, "Smith")) {return 1} }) return _.size(_.map(names, function(f) { return _.last(f.name.split(' ')) }))
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]true
true
var result = false if (_.size(_.filter(data, {gender: 'm'})) > _.size(_.filter(data, {gender: 'f'}))) {result = true} return result
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]"m"
"m"
// Filter input data array to find {name: 'Peter Pan'}, then _.pluck to get 'gender' field // Since _.pluck returns array, then use _.first to get first element of the array return _.first(_.pluck(_.filter(data, {name: 'Peter Pan'}), 'gender'))
[{name: 'John Smith', age: 54}, {name: 'Mary Smith', age: 42}, {name: 'Peter Pan', age: 15}, {name: 'Ben Smith', age: 35}]54
54
// _.pluck to look at all 'age' fields and then get _.max return _.max(_.pluck(data, 'age'))
[{name: 'John Smith', age: 54}, {name: 'Mary Smith', age: 42}, {name: 'Peter Pan', age: 15}, {name: 'Ben Smith', age: 35}]true
true
// use _.all return _.all(data, function(n) { return n.age < 60 })
[{name: 'John Smith', age: 54}, {name: 'Mary Smith', age: 42}, {name: 'Peter Pan', age: 15}, {name: 'Ben Smith', age: 35}]true
true
// use _.some return _.some(data, function(n) { return n.age < 18 })
[{name: 'John Smith', age: 54, favorites: ['food', 'movies']},
{name: 'Mary Smith', age: 42, favorites: ['food', 'travel']},
{name: 'Peter Pan', age: 15, favorites: ['minecraft', 'pokemo']},
{name: 'Ben Smith', age: 35, favorites: ['craft', 'food']}]3
3
// Need to process all entries to determine for each entry if (_.filter) 'food' is an // element of favorites sub-array and count return _.size(_.filter(data, function(n) { return _.some(n.favorites, function (d) { return d == 'food' }) }))
[{name: 'John Smith', age: 54, favorites: ['food', 'movies']},
{name: 'Mary Smith', age: 42, favorites: ['food', 'travel']},
{name: 'Peter Pan', age: 15, favorites: ['minecraft', 'pokemo']},
{name: 'Joe Johnson', age: 46, favorites: ['travel', 'movies']},
{name: 'Ben Smith', age: 35, favorites: ['craft', 'food']}][ "Mary Smith", "Joe Johnson" ]
[ "Mary Smith", "Joe Johnson" ]
return _.pluck(_.filter(data, function(n) { return _.some(n.favorites, function(d) { return d == 'travel' }) return n.age > 40 }), 'name')
[{name: 'John Smith', age: 54, favorites: ['food', 'movies']},
{name: 'Mary Smith', age: 42, favorites: ['food', 'travel']},
{name: 'Peter Pan', age: 15, favorites: ['minecraft', 'pokemo']},
{name: 'Joe Johnson', age: 46, favorites: ['travel', 'movies']},
{name: 'Ben Smith', age: 35, favorites: ['craft', 'food']}]"John Smith"
"John Smith"
// FIXME: I don't understand why I can't simply _.pluck out the name: value // from the _.filter/_.some nested loop var m_data = _.max(_.filter(data, function(f) { return _.some(f.favorites, function(d) { return d == 'food' }) }), 'age') return m_data.name
[{name: 'John Smith', age: 54, favorites: ['food', 'movies']},
{name: 'Mary Smith', age: 42, favorites: ['food', 'travel']},
{name: 'Peter Pan', age: 15, favorites: ['minecraft', 'pokemo']},
{name: 'Joe Johnson', age: 46, favorites: ['travel', 'movies']},
{name: 'Ben Smith', age: 35, favorites: ['craft', 'food']}][ "food", "movies", "travel", "minecraft", "pokemo", "craft" ]
[ "food", "movies", "travel", "minecraft", "pokemo", "craft" ]
// hint: use _.pluck, _.uniq, _.flatten in some order // Didn't need _.pluck in this exercise... return _.uniq(_.flatten(_.map(data, function(d) { return d.favorites })))
[{name: 'John Smith', age: 54, favorites: ['food', 'movies']},
{name: 'Mary Smith', age: 42, favorites: ['food', 'travel']},
{name: 'Peter Pan', age: 15, favorites: ['minecraft', 'pokemo']},
{name: 'Joe Johnson', age: 46, favorites: ['travel', 'movies']},
{name: 'Ben Smith', age: 35, favorites: ['craft', 'food']}][ "Smith", "Pan", "Johnson" ]
[ "Smith", "Pan", "Johnson" ]
return _.uniq(_.map(data, function(d) { return _.last(d.name.split(' ')) }))