我试图筛选对象的数组,基于另一个。 共同财产的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);
只要创建一个有效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/
您可以使用_.find
进行筛选:
_.filter(aaa, function(a){
return _.find(bbb, function(b){
return b.id === a.id;
});
});
您可以使用_.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/
bbb = bbb.map(_ => _.id) && aaa.filter(_ => bbb.indexOf( _.id ) > -1)
你只需要纯JS数组函数做假设你的使用情况。