数组去重的常用方法

1、for…in 循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var a1 = [1,2,4,2,6,2,7,4];
// 创建新数组接收
var arr = [];
// 对原数组创建循环
for(var i=0;i<a1.length;i++){
// 对原数组从下一个元素开始进行循环
for(var n=i+1;n<a1.length;n++){
// 当前下标的值等于后面原数组的下标值,就将当前下标+1;
if(a1[i]===a1[n]){
i++;
n = i;
}
}
arr.push(a1[i]);
}

2、for 循环 + indexOf 或者 forEach + indexOf

1
2
3
4
5
6
7
8
9
var a1 = [1,2,4,2,6,2,7,4];
// 创建新数组
var arr = [];
// 循环将非重数据push到新数组
for(var i=0;i<a1.length;i++){
if(arr.indexOf(a1[i])==-1){
arr.push(a1[i]);
}
}

3、基于对象的方式去重(效率相对较高)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//使用对象的属性不会重复的特性
// b 为需要去重的数组,key为去重的标识键
set(b, key) {
let arr = [].concat(b);
let result = [];
let obj = {};
for (let i of arr) {
if (!obj[i[key]]) {
result.push(i);
obj[i[key]] = 1;
}
}
return result;
}
set([{Id:"111"}, {Id:"222"}, {Id: "111"}], 'Id')

4、set 去重(代码最简洁,但效率相对对象的方法要低一些)

1
2
let arr = [1, 2, 1, 3, 2, 4, 3, 5, 4]
let newArr = [...new Set(arr)]

5、filter 去重

1
2
3
4
let arr = [1, 3, 7, 10, 10, 1,"A",'A',null,undefined,undefined,NaN,NaN];
let result = arr.filter((value,index,self) => {
return self.indexOf(value) == index; // 数组中的每个元素执行相同的函数,将结果组合成一个新数组。
})

6、filter + findIndex 去重

1
2
var a = [{ Id: '111' }, { Id: '222' }, { Id: '111' }, {Id: "333"}]
a.filter((x,index) => a.findIndex(y => y.Id === x.Id) == index)

7、取差集

1
2
3
4
5
6
7
8
9
10
let a = [{Id: "1111"}, {Id: "2222"}];
let b = [{Id: "2222"}, {Id: "3333"}];
// b相对于a差集
const diff = a.filter((x) =>
b.every((y) => y.Id !== x.Id)
);
// a相对于b差集
const diff = b.filter((x) =>
a.every((y) => y.Id !== x.Id)
);

8、取并集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 数组取并集
var a = [
{Id: "12345"},
{Id: "23456"},
];
var b = [
{Id: "12345"},
{Id: "34567"},
]

[...a.filter(x => !b.find(y => y.Id === x.Id)), ...b] // 方法一
[...a.filter(x => b.every(y => x.Id !== y.Id)), ...b] // 方法二

// 对象取并集
var a = {
Id: "123456",
Name: "张三"
};
var b = {
Id: "234567",
Age: 18
};

// 如果存在相同字段时,数据得到的是最后一个对象的数值
console.log(Object.assign(a, b)) // { Id: "234567", Name: "张三", Age: 18 }

9、取交集

1
2
3
4
5
6
7
8
9
10
var a = [
{Id: "12345"},
{Id: "23456"}
];
var b = [
{Id: "12345"},
{Id: "34567"}
];
a.filter(x => b.some(y => x.Id === y.Id)); // 方法一
a.filter(x => b.find(y => x.Id === y.Id)); // 方法二