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
return data.length
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}]
[ "John", "Mary", "Joe", "Ben" ]
[ "John", "Mary", "Joe", "Ben" ]
return _.map(data, function(d){ return d.name }) //return _.map(data, (d) => d.name)
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}]
[ "John", "Joe" ]
[ "John", "Joe" ]
// both soln work! which is better?? //return _.filter(_.pluck(data,'name'),function(str){ // return _.startsWith(str,'J'); //}) return _.pluck(_.filter(data,function(entry){ return _.startsWith(entry.name,'J'); }),'name');
[{name: 'John'}, {name: 'John'}, {name: 'John'}, {name: 'Ben'}]
3
3
var johns = _.filter(data, 'name', 'John'); var result = johns.length; return result
[{name: 'John Smith'}, {name: 'Mary Kay'}, {name: 'Peter Pan'}, {name: 'Ben Franklin'}]
[ "John", "Mary", "Peter", "Ben" ]
[ "John", "Mary", "Peter", "Ben" ]
function getFirstName(fullName) { return _.first(_.words(fullName)); // assume first name is just first word } return _.map(_.pluck(data,'name'), getFirstName);
[{name: 'John Smith'}, {name: 'Mary Smith'}, {name: 'Peter Pan'}, {name: 'Ben Smith'}]
[ "John", "Mary", "Ben" ]
[ "John", "Mary", "Ben" ]
function isSmith(entry){ return _.last(_.words(entry.name)) == 'Smith'; } function getFirstName(entry) { return _.first(_.words(entry.name)); // assume first name is just first word } var smiths = _.filter(data, isSmith); return _.map(smiths, getFirstName);
[{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(entry){ // assume first name is always one word, the rest is last name var nameArr = _.words(entry.name); var firstName = _.first(nameArr); var lastName = _.rest(nameArr).join(' '); return {"name":lastName+', '+firstName} })
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]
1
1
var women = _.filter(data,'gender','f'); return women.length
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]
2
2
var men = _.filter(data,'gender','m'); isSmith = function(entry){ return _.last(_.words(entry.name)) == 'Smith'; } var menSmith = _.filter(men, isSmith); return menSmith.length
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]
true
true
var genderCountArr = _.countBy(data,'gender'); return genderCountArr.m > genderCountArr.f
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]
"m"
"m"
return _.find(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
var largest = _.reduce(_.pluck(data, 'age'), function(largest,n) { return largest >= n? largest: n }) return largest
[{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(entry){ return entry.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(entry){ return entry.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
var foodies = _.filter(data,function(entry) { return _.includes(entry.favorites,'food') }); return foodies.length;
[{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" ]
var oldTravelers = _.filter(data,function(entry) { return (_.includes(entry.favorites,'travel') && entry.age > 40); }); return _.pluck(oldTravelers, '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"
var foodies = _.filter(data,function(entry) { return _.includes(entry.favorites,'food') }); var oldest = _.reduce(foodies, function (oldestFoodie,entry) { return oldestFoodie.age > entry.age ? oldestFoodie : entry }) return oldest.name; var result = 'not done' return result
[{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 var favorites = _.pluck(data, 'favorites'); return _.uniq(_.flatten(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" ]
var lastNames = _.map(data, function(entry){ // assume first name is always one word, the rest is last name var nameArr = _.words(entry.name); var firstName = _.first(nameArr); var lastName = _.rest(nameArr).join(' '); return lastName; }); return _.uniq(lastNames);