我有一个数组arr1 = [1,2,3,4,5]
还有另一种对象arr2 = [{'id':2, 'name':'A'},{'id':4, 'name':'B'}]
我正在寻找arr1
中的不在arr2
中的查找元素。预期的输出为[1,3,5]
我尝试了以下操作,但不起作用。
const arr = arr1.filter(i => arr2.includes(i.id));
可以帮忙吗?
答案 0 :(得分:2)
在Vanilla JS中具有O(arr2.length)+ O(arr1.length)复杂度的解决方案
var arr1= [1,2,3,4,5];
var arr2 = [{'id':2, 'name':'A'},{'id':4, 'name':'B'}];
var tmp = arr2.reduce(function (acc, obj) {
acc[obj['id']] = true;
return acc;
}, {});
var result = arr1.filter(function(nr) {
return !tmp.hasOwnProperty(nr);
})
答案 1 :(得分:1)
arr2
是一个对象数组,所以arr2.includes(i.id)
不起作用,因为i
(arr1
中的一项)是 number ,它没有id
属性和,因为arr2
是对象数组。
首先将arr2
的{{1}}转换为Set,然后检查set是否包含要迭代的项目:
id
答案 2 :(得分:1)
您可以尝试使用Array.prototype.some()
:
some()
方法测试数组中的至少一个元素是否通过了由提供的函数实现的测试。它返回一个布尔值。
const arr1 = [1,2,3,4,5]
const arr2 = [{'id':2, 'name':'A'},{'id':4, 'name':'B'}]
const arr = arr1.filter(i => !arr2.some(j => j.id == i));
console.log(arr);
答案 3 :(得分:0)
我们可以使用如下所示的过滤方法来检查所需条件
var arr1 = [1, 2, 3, 4, 5]
var arr2 = [{ 'id': 2, 'name': 'A' }, { 'id': 4, 'name': 'B' }]
var ids = [];
arr2.forEach(element => {
ids.push(element['id'])
});
var result = arr1.filter(s => ids.indexOf(s) < 0)
console.log(result)
答案 4 :(得分:0)
let arr1= [1,2,3,4,5];
let arr2 = [{'id':2, 'name':'A'},{'id':4, 'name':'B'}]
let arr2Ids=arr2.map(item=>item.id);
let result=arr1.filter(n => !arr2Ids.includes(n));
答案 5 :(得分:0)
由于arr2
由对象组成,因此您可以在arr2
上使用find而不是include
const arr = arr1.filter(i => !arr2.find(e => e.id===i));