数组去重常见的方法

利用ES6中的 Set 去重

Set 是 ES6 新增的一种数据结构,允许存储任何类型(原始值或引用值)的唯一值,使用这种方式非常简洁

1
2
3
4
5
6
function unique(arr) {
return Array.from(new Set(arr));
}

let array = [1, 2, 1, false, false, 'true', 'true', NaN, NaN];
console.log(unique(array)); // [1, 2, false, 'true', NaN]

利用ES6中的 Map 去重

Set 是 ES6 新增的一种数据结构,创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function unique(arr) {
let map = new Map();
let result = [];
for (let i = 0; i < arr.length; i++) {
if (!map.has(arr[i])) {
map.set(arr[i], false);
result.push(arr[i]);
} else {
map.set(arr[i], true);
}
}
return arr.filter((item, index) => index === arr.indexOf(item));
}

let array = [1, 2, 1, false, false, 'true', 'true', NaN, NaN];
console.log(unique(array)); // [1, 2, false, 'true']

利用数组的 includes 方法

includes 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回 false

1
2
3
4
5
6
7
8
9
10
11
12
function unique(arr) {
const result = [];
for (let i = 0; i < arr.length; i++) {
if (!result.includes(arr[i])) {
result.push(arr[i]);
}
}
return result;
}

let array = [1, 2, 1, false, false, 'true', 'true', NaN, NaN];
console.log(unique(array)); // [1, 2, false, 'true', NaN]

利用数组的 filter、indexOf 方法

1
2
3
4
5
6
function unique(arr) {
return arr.filter((item, index) => index === arr.indexOf(item));
}

let array = [1, 2, 1, false, false, 'true', 'true', NaN, NaN];
console.log(unique(array)); // [1, 2, false, 'true']

利用数组的 splice 方法

注意 NaN

1
2
3
4
5
6
7
8
9
10
11
12
13
function unique(arr) {
for (let i = 0; i < arr.length; i++) {
for (let j = 0; j < arr.length; j++) {
if (arr[i] === arr[j] && i!== j) {
arr.splice(j, 1);
}
}
}
return arr;
}

let array = [1, 2, 1, false, false, 'true', 'true', NaN, NaN];
console.log(unique(array)); // [1, 2, false, 'true', NaN, NaN]

利用递归去重

注意 NaN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function unique(arr) {
let array = arr;
let len = array.length;

//排序后更加方便去重
array.sort(function (a, b) {
return a - b;
})

function loop(index) {
if (index >= 1) {
if (array[index] === array[index - 1]) {
array.splice(index, 1);
}
//递归loop,然后数组去重
loop(index - 1);
}
}
loop(len - 1);
return array;
}

let array = [1, 2, 1, false, false, 'true', 'true'];
console.log(unique(array)); // [1, 2, false, 'true']