underscore.js根据另一个对象过滤一个对象数组

bsr*_*bsr 23 javascript underscore.js

我试图基于另一个过滤对象数组.共同属性id id.我不确定过滤器+每个是最好的方法或映射减少.无论如何,下面的代码不能像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);
Run Code Online (Sandbox Code Playgroud)

kay*_*kay 39

只需创建有效ID的"集合"并使用"set"进行过滤:

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);
Run Code Online (Sandbox Code Playgroud)

填充ids速度很快,它在n*摊销的 O(1)中,即O(n).同样适用于过滤.

如果each(…)在内循环中使用,则将具有O(n²).对于更大的数据集,这将变得非常慢.此外,额外的嵌套使得代码乍一看更难以阅读/理解.

看到该代码已截断:http://jsfiddle.net/SMtX5/


小智 19

你可以_.find用来过滤:

_.filter(aaa, function(a){
    return _.find(bbb, function(b){
        return b.id === a.id;
    });
});
Run Code Online (Sandbox Code Playgroud)