希望在下划线过滤器后返回ID列表

时间:2014-04-10 14:26:01

标签: javascript arrays underscore.js

我想知道是否有一种简单的方法可以从过滤后的数组中返回ID列表。

这是一个JSFiddle,我正在过滤一个数组http://jsfiddle.net/eRzBL/

var array = [{'id':1, 'Color':'blue'},
             {'id':2, 'Color':'orange'}, 
             {'id':3, 'Color':'green'}, 
             {'id':4, 'Color':'blue'} ];

var myFilter = array.filter(function (item) {
                    return item.Color === 'blue';
                });

我想返回一个ID列表,而不是返回一个对象列表。在这种情况下[1,4]。我可以创建一个新数组,遍历这个集合并附加ID,但我想知道我是否可以使用现有的下划线功能来实现这一点。

1 个答案:

答案 0 :(得分:4)

您可以通过将过滤后的数据传递到map来扩展这个想法,只获取ID。

var result = array.filter(function(item) {
    return item.Color === 'blue';
}).map(function(item) {
    return item.id;
});

console.log(result)
# [1, 4]

如果你想用下划线做这个,

var result = _.chain(array)
    .filter(function(item) {
        return item.Color === 'blue';
    })
    .pluck("id")
    .value();

console.log(result);
# [1, 4]

此外,您可以使用_.where,就像这样

var result = _.chain(array)
    .where({Color: 'blue'})
    .pluck("id")
    .value();

console.log(result)
# [1, 4]

如果您更喜欢oneliners,

console.log(_.pluck(_.where(array, {Color: 'blue'}), "id"));
# [1, 4]

注意:上述方法都不能超越原生JavaScript的性能

var result = [];
for (var i = 0; i < array.length; i += 1) {
    if (array[i].Color === "blue") {
        result.push(array[i].id);
    }
}
console.log(result);
# [1, 4]