在角度2中合并没有重复的对象数组

时间:2017-05-09 14:46:43

标签: angular typescript

在Angular2 / Typescript(ES6)中合并两个没有重复的数组的最快捷最简单的方法。

P.S。数组包含嵌套对象。

我知道那里已经有很多答案了。这就是为什么我感到困惑的原因。我在this上尝试了答案,但我无法使其发挥作用。

提前致谢。

2 个答案:

答案 0 :(得分:5)

这与angular2 / typescript无关,我的答案适用于ES6。

使用来自lodash(https://lodash.com/docs/4.17.4#uniq)的uniq函数来源数组中的项目,如下所示:

const arrA = [1, 2, 3, 4];
const arrB = [3, 4, 5, 6];
const arr = _.uniq([...arrA, ...arrB])
// [1, 2, 3, 4, 5, 6]

对于嵌套对象,请使用uniqByhttps://lodash.com/docs/4.17.4#uniqBy)或uniqWith

const arrA = [{id: 1, n: 'e'}, {id: 2, n: 'z'}];
const arrB = [{id: 2, n: 'z'}, {id: 3, n: 'c'}];
const arr = _.uniqBy([...arrA, ...arrB], 'id')
// [{id: 1, n: 'e'}, {id: 2, n: 'z'}, {id: 3, n: 'c'}]

但是你需要一个唯一的标识符(这里是id)才能知道何时重复。

[编辑] 如果您没有唯一标识符,并希望使用整个对象进行重复数据删除,则可以这样做:

const arrA = [{a: 'a'}, {b: 'b'}];
const arrB = [{b: 'b'}, {c: 'c'}];
const arr = _.uniqBy([...arrA, ...arrB], JSON.stringify)
// [{a: 'a'}, {b: 'b'}, {c: 'c'}]

它将对所有对象进行字符串化以检查是否存在相同的字符串值,因此请记住它在巨大的对象/数组上可能代价高昂。拥有唯一标识符是一种更好的做法。

答案 1 :(得分:0)

如果使用打字稿,则可以这样:

const a = [1, 2, 3];
const b = [2, 3, 4, 5];

result = a.concat(b.filter(x => a.every(y => y !== x))); //[1, 2, 3, 4, 5];

使用b.filter(x => a.every(y => y !== x))可以过滤出重复项。 如果需要使用此方法来连接多个数组,则需要创建一个函数,在该函数中可以循环数组,但再次使用与上述相同的方法。

function mergeArraysWithoutDuplicates(arrays: any[]){
  var result = [];

  for(const array in arrays){

    result.push(result.concat(array.filter(x => result.every(y => y !== x)));

  }
    return result;
}

该代码未经测试,但是应该是这样,取决于需要。 结果,该函数将返回没有重复的新数组。