underscore.js过滤对象的阵列,基于另一(underscore.js filter an

2019-08-17 05:28发布

我试图筛选对象的数组,基于另一个。 共同财产的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);

Answer 1:

只要创建一个有效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)。 同样适用于过滤。

如果您使用each(…)在内部循环,你将有O(N²)。 对于更大的数据集,这将变得非常缓慢。 另外,附加的嵌套使代码更难以阅读/乍一看明白。

看到代码在行动剪断: http://jsfiddle.net/SMtX5/



Answer 2:

您可以使用_.find进行筛选:

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


Answer 3:

您可以使用_.some(list, [iterator], [context])

如果列表中的任何值的通过迭代真相测试返回TRUE。

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

这里的jsfiddle。 http://jsfiddle.net/h98ej/



Answer 4:

bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf( _.id ) > -1)

你只需要纯JS数组函数做假设你的使用情况。



文章来源: underscore.js filter an array of objects, based on another