我理解pick是用来获取一个只具有指定属性的对象:
_.pick({name: 'moe', age: 50, userid: 'moe1'}, 'name', 'age');
=> {name: 'moe', age: 50}
如何在数组上执行相同的操作呢?假设我有一个数组,如
[{name: 'moe1', age: 50, userid: 'moe1'},
{name: 'moe2', age: 50, userid: 'moe1'},
{name: 'moe3', age: 50, userid: 'moe1'}]
,我想将它映射到一个数组,以便只包含name
和age
属性,如:
[{name: 'moe1', age: 50},
{name: 'moe2', age: 50},
{name: 'moe3', age: 50}]
我是否必须在数组上执行each()
,然后在每个对象上执行pick()
,或者有更清洁的方法?
编辑
对不起,但只是另一个小要求,我该如何执行where(即获得所有年龄大于50岁的人),然后执行pick
?编辑像这样完成了,不知道在下划线中链接是如何工作的。
_(data).reject(function (r) { return d.age<51; }).map(function (o) {
return _.pick(o, "age", "name");
});
您必须使用_.map
并在所有对象上应用相同的_.pick
。
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);
[ { name: 'moe1', age: 50 },
{ name: 'moe2', age: 50 },
{ name: 'moe3', age: 50 } ]
如果您想获取年龄> 50的对象,您可能想这样做
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);
[ { name: 'moe3', age: 60 } ]
你也可以对链接做同样的事情,正如rightfold所建议的那样,像这样
var result = _.chain(data).filter(filterByAge).map(omitUserId).value();
您可以只使用一个lodash方法(~50kb import):
npm i lodash.pick
解决方案:
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))
输出:[ { name: 'moe2', age: 50 }, { name: 'moe3', age: 50 } ]