可以在包含数组的对象上使用_.pluck吗?

时间:2014-02-28 17:50:32

标签: javascript underscore.js

说我有一个类似下面的对象:

{
  mainId: 1,
  subArray1: [{count: 3, name: 'whatever'}, {count:5, name: 'something else'}],
  subArray2: [{count: 6, name: 'more stuff'}, {count:7, name: 'who cares'}]
}

有什么方法可以使用underscore.js'pluck函数为父对象中的所有数组创建所有计数的数组?我试过了:

_.pluck(parentObject, 'count')

但这显然不起作用。到目前为止,我不得不为每个subArray单独调用:

_.pluck(parentObject.subArray1, 'count')
_.pluck(parentObject.subArray2, 'count')

然后连接数组。有没有办法在父对象上使用pluck并一举获取所有子数组的值?

3 个答案:

答案 0 :(得分:1)

你必须循环你的原始对象,所以像这样的东西会起作用。 我认为没有办法避免以某种形式编写循环,即map或forEach。

var resultArr = [];

_.each(parentObject, function(elem, index){
  resultArr = resultArr.concat(_.pluck(elem, 'count'););
});

答案 1 :(得分:1)

我认为你不能只用pluck来做你想做的事情,但是mappluck的组合可以让你到达那里:

_.map(parentObject, function(item) { return _.pluck(item, 'count'); }));

这会给你:

[[],[3,5],[6,7]]

如果你想丢弃非数组的计数,你也可以这样做:

_.compact(_.map(parentObject, function(item) {
  if (_.isArray(item)) { return _.pluck(item, 'count'); }
}));

这将为非数组返回null,然后compact将删除空值,为您提供:

[[3,5],[6,7]]

要变平,只需:

_.flatten(_.compact(_.map(parentObject, function(item) {
  if (_.isArray(item)) { return _.pluck(item, 'count'); }
})));

给你:

[3, 5, 6, 7]

答案 2 :(得分:0)

我会这样做:

var i = 0, subArray, counts = [];
while (subArray = ct['subArray' + (++i)]) {
    counts = counts.concat(subArray);
}
counts = _.pluck(counts, 'count');