比较两个包含对象的数组,并创建一个新的数组,其中包含不匹配的对象。

8

我有以下两个Javascript数组:

const array1 = [{ id: 1}, { id: 2 }, { id: 3 }, { id: 4}];
const array2 = [{ id: 1}, { id: 3 }];

我现在想要一个新的数组array3,它只包含那些不在array2中的对象,因此:
const array3 = [{ id: 2}, { id: 4 }];

我尝试了以下方法,但它返回了所有对象,当我将条件更改为===时,它返回了array2的对象。

const array3 = array1.filter(entry1 => {
  return array2.some(entry2 => entry1.id !== entry2.id);
});

有什么想法吗?欢迎使用 ES6

2个回答

20
你可以将比较反转(等于而不是不等于),并返回 some 的结果取反。

const
    array1 = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }],
    array2 = [{ id: 1 }, { id: 3 }],
    array3 = array1.filter(entry1 => !array2.some(entry2 => entry1.id === entry2.id));
    //                               ^                                ^^^

console.log(array3);


如果您的条件是直接比较,您可以使用 array.includes()。附加参考:.includes() vs .some() - Gangula

1
尼娜的答案是一个不错的起点,但会忽略数组2中的任何独特元素。以下是对她的回答进行扩展,以获取每个数组的唯一元素,然后将它们组合起来:

const
    array1 = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }],
    array2 = [{ id: 1 }, { id: 3 }, { id: 5 }],
    array3 = array1.filter(entry1 => !array2.some(entry2 => entry1.id === entry2.id)),
    array4 = array2.filter(entry1 => !array1.some(entry2 => entry1.id === entry2.id)),
    array5 = array3.concat(array4);

console.log(array5);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接