Reputation: 17492
I understand that pick is used to get back an object with only specified properties:
_.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');
=> {name: 'moe', age: 50}
How would I perform that same operation on an array, say I have an array such as:
[{name: 'moe1', age: 50, userid: 'moe1'},
{name: 'moe2', age: 50, userid: 'moe1'},
{name: 'moe3', age: 50, userid: 'moe1'}]
and I want to map it to an array so to include only the name
and age
properties, like:
[{name: 'moe1', age: 50},
{name: 'moe2', age: 50},
{name: 'moe3', age: 50}]
Do I have to do an each()
on the array then perform a pick()
on each object, or is there a cleaner way?
EDIT
Sorry but just another small requirement, how would I perform a where (i.e. get all those whose age is greater than 50) and then perform the pick
?
EDIT
got it done like this, was unaware of how chaining works in underscore.
_(data).reject(function (r) { return d.age<51; }).map(function (o) {
return _.pick(o, "age", "name");
});
Upvotes: 18
Views: 20599
Reputation: 103
You can take just one lodash method for that (~50kb import):
npm i lodash.pick
Solution:
const pick = require('lodash.pick')
const filterValues = ['name', 'age']
const arr = [
{ name: 'moe1', age: 52, userid: 'moe1' },
{ name: 'moe2', age: 50, userid: 'moe1' },
{ name: 'moe3', age: 50, userid: 'moe1' }
]
const result = arr
.filter(item => item.age < 51)
.map(item => pick(item, filterValues))
Output:
[ { name: 'moe2', age: 50 }, { name: 'moe3', age: 50 } ]
Upvotes: 1
Reputation: 239473
You have to use _.map
and apply the same _.pick
on all the objects.
var data = [{name: 'moe1', age: 30, userid: 'moe1'},
{name: 'moe2', age: 50, userid: 'moe1'},
{name: 'moe3', age: 60, userid: 'moe1'}];
var result = _.map(data, function(currentObject) {
return _.pick(currentObject, "name", "age");
});
console.log(result);
Output
[ { name: 'moe1', age: 50 },
{ name: 'moe2', age: 50 },
{ name: 'moe3', age: 50 } ]
If you want to get the objects in which the age is > 50, you might want to do, like this
var data = [{name: 'moe1', age: 30, userid: 'moe1'},
{name: 'moe2', age: 50, userid: 'moe1'},
{name: 'moe3', age: 60, userid: 'moe1'}];
function filterByAge(currentObject) {
return currentObject.age && currentObject.age > 50;
}
function omitUserId(currentObject) {
return _.omit(currentObject, "userid");
}
var result = _.map(_.filter(data, filterByAge), omitUserId);
console.log(result);
Output
[ { name: 'moe3', age: 60 } ]
You can do the same with chaining, as suggested by rightfold, like this
var result = _.chain(data).filter(filterByAge).map(omitUserId).value();
Upvotes: 34