仅将唯一元素附加到Angular2中的对象数组

时间:2017-10-25 22:43:51

标签: javascript arrays algorithm angular typescript

我有两个对象数组 - 新旧对象。必须通过一个唯一字段(MAC地址)比较对象。我想获得第三个数组或将其附加到现有旧数组并仅添加新对象。

例如

oldArray = [{mac: 11}, {mac: 12}, {mac: 14}];
newArray = [{mac: 11}, {mac: 13}, {mac: 14}];

我想像这样返回数组:

array = [{mac: 11}, {mac: 12}, {mac:13}, {mac: 14}]

我已经设法在Swift中使用contains方法做了类似的事情但是却无法在打字稿中找到解决方案。

1 个答案:

答案 0 :(得分:4)

我会使用像

这样的东西
let oldArray = [{mac: 11}, {mac: 12}, {mac: 14}];
let newArray = [{mac: 11}, {mac: 13}, {mac: 14}];
let tempSet = new Set([...oldArray, ...newArray].map(i => JSON.stringify(i)));
let resultArray = Array.from(tempSet).map(i => JSON.parse(i));

console.log(resultArray); // [{mac: 11}, {mac: 12}, {mac:13}, {mac: 14}]

JSON parse / stringify使得它可以作为数组项用于任何类型的对象,不仅适用于像{mac: N}这样的单属性对象。

两个版本基于Array.prototype.reduce,没有中间Set

显式(mac prop对象):

let resultArray = [...oldArray, ...newArray].reduce((s, i) => 
  !s.some(j => i.mac === j.mac) ? [...s, i] : s
, []);

Generic(任何对象):

let resultArray = [...oldArray, ...newArray].reduce((s, i) => 
  !s.some(j => JSON.stringify(i) === JSON.stringify(j)) ? [...s, i] : s
, []);