Javascript Underline.js根据另一个对象筛选对象数组
我正在尝试根据另一个对象筛选对象数组。公共属性idJavascript 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
。
我不确定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)