数组去重的几种方式

数组去重的几种方式

借助ES6中Set数据结构成员的唯一性

(注:以下内容来源于阮一峰老师的ES6入门在线文档)

​ ES6中Set数据结构是一个类数组结构,Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。

​ 向 Set 加入值的时候,不会发生类型转换,所以5和”5”是两个不同的值。Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是NaN等于自身,而精确相等运算符认为NaN不等于自身。两个对象总是不等的。

​ 再使用扩展运算符将Set转化为数组。

去重:[…new Set(array)]

借助Array.prototype.reduce()方法,先排序再去重

1
2
3
4
5
6
7
8
9
10
let arr = [1,3,5,3,2,4,5];

let result = arr.sort().reduce((init, current)=>{
if(init.length === 0 || init[init.length-1]!==current){
init.push(current);
}
return init;
}, []);

console.log(result); //[1, 2, 3, 4, 5]

​ 使用arr.sort()排序会存在一些问题,sort()默认的排序方法是根据字符串Unicode码点,在比较之前,元素会被转化成字符串,MDN上一个排序的例子:

1
2
3
4
5
6
var scores = [1, 10, 21, 2]; 
scores.sort(); //[1, 10, 2, 21]

注意102之前,
因为在 Unicode 指针顺序中"10""2"之前
同样 Unicode 顺序上 "80" 要比 "9" 要靠前

所以尽量依照目前排序元素的特点,选择合适的compareFunction参数或选取其它方法。

遍历原有数组,利用 indexOf() 将非重复的值添加到新数组中去

1
2
3
4
5
6
7
8
9
10
let arr = [1,3,5,3,2,4,5];
let len = arr.length,
newArr = [];

for(let i=0;i<len;i++){
if(newArr.indexOf(arr[i])===-1){
newArr.push(arr[i]);
}
}
console.log(newArr); //[1, 3, 5, 2, 4]

建立一个哈希表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
let arr =  [1,3,5,3,2,4,5];

function unique(a) {
let hash = {},
len = a.length,
result = [];

for (var i = 0; i < len; i++){
if (!hash[a[i]]){
hash[a[i]] = true;
result.push(a[i]);
}
}
return result;
}

unique(arr); // 输出[1, 3, 5, 2, 4]

Copyright © 2018 - 2019 诗之花绪 All Rights Reserved.

UV : | PV :