Lodash Drills
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).
- enter your solution in the
solutionblock - utilize lodash functions as much as possible
- no
for/whileloop is allowed
Familiarity 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.
Examples
How many people?
Done
Data
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}]Expected Output
4
Actual Output
4
Solution
return data.lengthWhat are the names?
Done
Data
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}]Expected Output
[ "John", "Mary", "Joe", "Ben" ]
Actual Output
[ "John", "Mary", "Joe", "Ben" ]
Solution
return _.map(data, function(d){ return d.name })
Exercises
What names begin with the letter J?
Done
Data
[{name: 'John'}, {name: 'Mary'}, {name: 'Joe'}, {name: 'Ben'}]Expected Output
[ "John", "Joe" ]
Actual Output
[ "John", "Joe" ]
Solution
return _.filter(_.pluck(data, 'name'), function(n) { return _.startsWith(n, 'J') })
How many Johns?
Done
Data
[{name: 'John'}, {name: 'John'}, {name: 'John'}, {name: 'Ben'}]Expected Output
3
Actual Output
3
Solution
return _.filter(data, {name: 'John'}).length
What are all the first names?
Done
Data
[{name: 'John Smith'}, {name: 'Mary Kay'}, {name: 'Peter Pan'}, {name: 'Ben Franklin'}]Expected Output
[ "John", "Mary", "Peter", "Ben" ]
Actual Output
[ "John", "Mary", "Peter", "Ben" ]
Solution
return _.map(data, function(d) { return _.words(d.name)[0] })
What are the first names of Smith?
Done
Data
[{name: 'John Smith'}, {name: 'Mary Smith'}, {name: 'Peter Pan'}, {name: 'Ben Smith'}]Expected Output
[ "John", "Mary", "Ben" ]
Actual Output
[ "John", "Mary", "Ben" ]
Solution
return _.map(_.filter(_.map(data, function (d) { /* first map to list of [first, last] tuples */ return _.words(d.name) }), function (n) { /* next filter all Smiths */ return n[1] == 'Smith' }), function(s) { /* then take first names */ return s[0] })
Change the format to lastname, firstname
Done
Data
[{name: 'John Smith'}, {name: 'Mary Kay'}, {name: 'Peter Pan'}]Expected Output
[
{
"name": "Smith, John"
},
{
"name": "Kay, Mary"
},
{
"name": "Pan, Peter"
}
]Actual Output
[
{
"name": "Smith, John"
},
{
"name": "Kay, Mary"
},
{
"name": "Pan, Peter"
}
]Solution
return _.map(data, function(d) { var w = _.words(d.name) /* convert name string to list [first, last] */ return {'name': w[1].concat(', ', w[0])} /* then swap first and last names */ })
How many women?
Done
Data
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]Expected Output
1
Actual Output
1
Solution
return _.filter(data, 'gender', 'f').length
How many men whose last name is Smith?
Done
Data
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]Expected Output
2
Actual Output
2
Solution
return _.filter( _.map( _.filter(data, 'gender', 'm'), /* extract all males */ function(m) { /* map name string to tuple */ return _.words(m.name) }), function(n) { /* return only Smiths */ return n[1] == 'Smith' }).length /* then count resulting names */
Done
Data
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]Expected Output
true
Actual Output
true
Solution
return _.filter(data, 'gender', 'm').length > data.length/2
What is Peter Pan's gender?
Done
Data
[{name: 'John Smith', gender: 'm'}, {name: 'Mary Smith', gender: 'f'}, {name: 'Peter Pan', gender: 'm'}, {name: 'Ben Smith', gender: 'm'}]Expected Output
"m"
Actual Output
"m"
Solution
return _.filter(data, 'name', 'Peter Pan')[0].gender
What is the oldest age?
Done
Data
[{name: 'John Smith', age: 54}, {name: 'Mary Smith', age: 42}, {name: 'Peter Pan', age: 15}, {name: 'Ben Smith', age: 35}]Expected Output
54
Actual Output
54
Solution
return _.max(data, 'age').age
Is it true everyone is younger than 60?
Done
Data
[{name: 'John Smith', age: 54}, {name: 'Mary Smith', age: 42}, {name: 'Peter Pan', age: 15}, {name: 'Ben Smith', age: 35}]Expected Output
true
Actual Output
true
Solution
return _.all(data, function(d) { return d.age < 60 })
Is it true someone is not an adult (younger than 18)?
Done
Data
[{name: 'John Smith', age: 54}, {name: 'Mary Smith', age: 42}, {name: 'Peter Pan', age: 15}, {name: 'Ben Smith', age: 35}]Expected Output
true
Actual Output
true
Solution
return _.some(data, function(d) { return d.age < 18 })
How many people whose favorites include food?
Done
Data
[{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']}]Expected Output
3
Actual Output
3
Solution
return _.filter(data, function(d) { return _.includes(d.favorites, 'food') }).length
Who are over 40 and love travel?
Done
Data
[{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']}]Expected Output
[ "Mary Smith", "Joe Johnson" ]
Actual Output
[ "Mary Smith", "Joe Johnson" ]
Solution
return _.pluck( _.filter(data, function(d) { /* extract all age > 40 & travel lovers */ return d.age > 40 && _.includes(d.favorites, 'travel') }), 'name' /* return only names */ )
Who is the oldest person loving food?
Done
Data
[{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']}]Expected Output
"John Smith"
Actual Output
"John Smith"
Solution
return _.max( _.filter(data, function(d) { /* first extract all those who love food */ return _.includes(d.favorites, 'food') }), 'age' /* then find oldest person */ ).name /* return name */
What are all the unique favorites?
Done
Data
[{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']}]Expected Output
[ "food", "movies", "travel", "minecraft", "pokemo", "craft" ]
Actual Output
[ "food", "movies", "travel", "minecraft", "pokemo", "craft" ]
Solution
// hint: use _.pluck, _.uniq, _.flatten in some order return _.unique(_.flatten(_.pluck(data, 'favorites')))
What are all the unique last names?
Done
Data
[{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']}]Expected Output
[ "Smith", "Pan", "Johnson" ]
Actual Output
[ "Smith", "Pan", "Johnson" ]
Solution
return _.unique( _.map( _.pluck(data, 'name'), /* extract names */ function(n){ return _.words(n)[1] /* then take last names */ }) )