Javascript Underline.js根据另一个对象筛选对象数组

Javascript Underline.js根据另一个对象筛选对象数组,javascript,underscore.js,Javascript,Underscore.js,我正在尝试根据另一个对象筛选对象数组。公共属性idid。 我不确定filter+each是做这件事的最好方法还是map reduce。无论如何,下面的代码不起作用,因为out是空列表 var aaa = [ {name: "AAA", id: 845}, {name: "BBB", id: 839}, {name: "CCC", id: 854} ]; var bbb = [ {id: 839}, {id: 854} ]; var out = _.fil

我正在尝试根据另一个对象筛选对象数组。公共属性id
id
。 我不确定filter+each是做这件事的最好方法还是map reduce。无论如何,下面的代码不起作用,因为
out
是空列表

var aaa = [
    {name: "AAA", id: 845},
    {name: "BBB", id: 839},
    {name: "CCC", id: 854}
];
var bbb = [
    {id: 839},
    {id: 854}
];

var out = _.filter(aaa, function(val){
    return _.each(this, function(val2){
        return val['id'] === val2['id']
    });
}, bbb);
只需创建一个有效ID的“集合”,并使用该“集合”进行过滤:

var aaa = [
    {name: "AAA", id: 845},
    {name: "BBB", id: 839},
    {name: "CCC", id: 854}
];
var bbb = [
    {id: 839},
    {id: 854}
];

var ids = {};
_.each(bbb, function (bb) { ids[bb.id] = true; });

var out = _.filter(aaa, function (val) {
    return ids[val.id];
}, bbb);
填充
ids
很快,它位于n*O(1),即O(n)。过滤也是如此

如果在内部循环中使用
每个(…)
,则将有O(n²)。对于较大的数据集,这将变得非常缓慢。另外,额外的嵌套使代码乍看起来更难阅读/理解

请参阅在操作中截取的代码:

您可以使用

如果列表中的任何值通过迭代器真值测试,则返回真值

var out = _.filter(aaa, function(val){
    return _.some(this,function(val2){
        return val2['id'] === val['id'];
    });
}, bbb);

这是JSFIDLE

您可以使用
查找
来筛选:

_.filter(aaa, function(a){
    return _.find(bbb, function(b){
        return b.id === a.id;
    });
});

假设您的用例,您只需要纯JS数组函数就可以完成此任务。

下面是解释和推理。根据公认的答案,此例程比公认的快多少?
bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf( _.id ) > -1)