在另一个对象数组中查找数组中不包含的元素

时间:2019-12-17 10:11:09

标签: javascript

我有一个数组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));

可以帮忙吗?

6 个答案:

答案 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)不起作用,因为iarr1中的一项)是 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));