数组的下划线相当于_.pick

时间:2014-03-09 09:53:19

标签: javascript arrays underscore.js

我知道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'}]

我希望将其映射到数组,以便仅包含nameage属性,例如:

[{name: 'moe1', age: 50},
{name: 'moe2', age: 50},
{name: 'moe3', age: 50}]

我是否必须在阵列上执行each()然后对每个对象执行pick(),或者是否有更清洁的方式?

修改

很抱歉,但只是另一个小要求,我将如何执行某个地方(即获取所有年龄大于50岁的人),然后执行pick? 的修改 像这样完成它,不知道链接如何在下划线中起作用。

_(data).reject(function (r) { return d.age<51; }).map(function (o) {
            return _.pick(o, "age", "name");
});

1 个答案:

答案 0 :(得分:30)

您必须使用_.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 } ]

您可以使用链接as suggested by rightfold执行相同操作,就像这样

var result = _.chain(data).filter(filterByAge).map(omitUserId).value();