如果对象数组1在第二个对象数组中不存在,我想过滤它。来自第二个数组的非相交值
> aaa = [{id:1, name:"abc"}, {id:2, name:"xyz"}],
> bbb = [{group:1}, {group:4}]
> result should be [{id:2, name:"xyz"}]
_.filter(aaa, function(a){
return _.find(bbb, function(b){
return b.id !== a.group;
});
});
但是结果是使用此代码是错误的。请在这里帮助我
答案 0 :(得分:1)
使用lodash可以使用_.reject
,它不包含找到的项目。与_.filter
_.reject(collection, [predicate=_.identity])
var aaa = [{ id: 1, name: "abc" }, { id: 2, name: "xyz" }],
bbb = [{ group: 1 }, { group: 4 }],
result = _.reject(aaa, ({ id }) => _.find(bbb, ({ group }) => group === id));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
您可以将不需要的find
放在Set
中,并检查是否需要过滤,而不是在每次迭代中都使用id
。
var aaa = [{ id: 1, name: "abc" }, { id: 2, name: "xyz" }],
bbb = [{ group: 1 }, { group: 4 }],
groups = new Set(bbb.map(({ group }) => group)),
result = aaa.filter(({ id }) => !groups.has(id));
console.log(result);
答案 1 :(得分:1)
这是一个基于下划线的解决方案。
b.id !== a.group
-> a.id !== b.group
以匹配对象的结构。
然后,
a.id !== b.group
-> a.id === b.group
并取消查找结果,以正确过滤您的对象;)
const aaa = [{id:1, name:"abc"}, {id:2, name:"xyz"}];
const bbb = [{group:1}, {group:4}];
const result = _.filter(aaa, function(a){
return !_.find(bbb, function(b){
return a.id === b.group;
});
});
console.log(result);
<script src="https://underscorejs.org/underscore-min.js"></script>