将两个Arrays与Objects进行比较,并使用不匹配的对象创建新数组

时间:2017-12-04 22:08:11

标签: javascript arrays ecmascript-6

我有以下两个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 个答案:

答案 0 :(得分:7)

您可以反转比较(等于而不是等于)并返回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);

答案 1 :(得分:0)

Nina的回答是一个良好的开端,但会错过阵列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);