在Angular2 / Typescript(ES6)中合并两个没有重复的数组的最快捷最简单的方法。
P.S。数组包含嵌套对象。
我知道那里已经有很多答案了。这就是为什么我感到困惑的原因。我在this上尝试了答案,但我无法使其发挥作用。
提前致谢。
答案 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]
对于嵌套对象,请使用uniqBy
(https://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;
}
该代码未经测试,但是应该是这样,取决于需要。 结果,该函数将返回没有重复的新数组。