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

cod*_*der 2 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';
                });
Run Code Online (Sandbox Code Playgroud)

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

the*_*eye 7

您可以通过将过滤后的数据传递map给仅获取 id来扩展这个想法。

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

console.log(result)
# [1, 4]
Run Code Online (Sandbox Code Playgroud)

如果你想用下划线来做到这一点,

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

console.log(result);
# [1, 4]
Run Code Online (Sandbox Code Playgroud)

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

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

console.log(result)
# [1, 4]
Run Code Online (Sandbox Code Playgroud)

如果你更喜欢单线,

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

注意:以上所见方法都无法超越原生 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]
Run Code Online (Sandbox Code Playgroud)