基于Javascript中的第二个对象数组过滤对象数组1(UnderscoreJS)

时间:2019-04-11 11:07:33

标签: javascript arrays underscore.js

如果对象数组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;
    });
});

但是结果是使用此代码是错误的。请在这里帮助我

2 个答案:

答案 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>