归纳的多种js数组去重复的方法,包括五种基本方法和ES6的三种简洁的方法。

1. 新数组法

思路: 判断数组每项值,值不在新数组就push进新数组

1
2
3
4
5
6
7
8
9
var ary = [1,2,3,3,2,3,4,5];
var newary = [];
for(var i = 0; i < ary.length; i++){
if(newary.indexOf(ary[i]) == -1){
newary.push(ary[i]);
}
}
alert(newary);
//[1,2,3,4,5]

2. 数组下表判断法

思路:类似第一种,判断值在数组中的索引,索引和i不相等就push进新数组

1
2
3
4
5
6
7
8
9
var ary = [1,2,3,3,2,3,4,5];
var newarr = [];
for(var i = 0; i < ary.length; i++){
if(ary.indexOf(ary[i]) == i){
newarr.push(ary[i]);
}
}
alert(newarr);
//[1,2,3,4,5]

3. 对象键值对法

思路:可以记录次数的对象去重,判断当前数组值作为对象的key是否存在值, 存在即把对象的值+1,否则值置为1,对象的key为数组的值,value为次数;此方法利用了object键的唯一性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var ary = [1,2,3,3,2,3,4,5];
var obj = {};
for(var i = 0; i < ary.length; i++){
var curvalue = ary[i];
if(obj[curvalue]){
obj[curvalue]++;
}else{
obj[curvalue] = 1;
}
}
var ary=[];
for(var attr in obj){
ary.push(attr);
}
alert(ary);
//[1,2,3,4,5]

变式:

1
2
3
4
5
6
7
8
9
10
11
var obj = {}, newarr = [], val, type; 
for (var i = 0; i < array.length; i++) {
val = array[i];
type = typeof val;
if (!obj[val]) {
obj[val] = type;
newarr.push(val);
}
}
alert(newarr);
//[1,2,3,4,5]

4. 排序后相邻元素对比

思路:利用sort()方法先对数组进行排序后,相邻元素对比不同push到新数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var array = [3,6,3,9,7,5,9,12];
array.sort(function(x,y){
if(x < y){
return -1;
}else if(x>y){
return 1
}
return 0;
});
var prevarr = [array[0]];
for(var i = 1; i < array.length; i++){
if( array[i] !== prevarr[prevarr.length-1]){
prevarr.push(array[i]);
}
}
alert(prevarr);
//[3,5,6,7,9,12]

5. 优化遍历法

思路:利用双重循环,遇到重复元素跳出外层循环,进入下一次外层循环 这样就避免了重复元素的追加。有种冒泡排序的感觉0.0。

1
2
3
4
5
6
7
8
9
10
11
var array = [12,252,32,32,22,12,45,50];
var r = [];
for(var i = 0, l = array.length; i < l; i++) {
for(var j = i + 1; j < l; j++)
if (array[i] === array[j]){
j = ++i;
}
r.push(array[i]);
}
alert(r);
//[252,32,22,12,45,50]

6. 利用ES6新特性的三种方法

思路:利用ES6中的Set数据结构,…扩展运算符,Array.from()数组转化的方法。

1. Set构造函数加…扩展运算符

1
2
3
4
5
6
const set = new Set([1,5,3,4,5,1,1,0]);

var unique = [...set];

alert(unique);
//[1,5,3,4,0]

2. 函数传值加数组序列化方法

1
2
3
4
5
6
7
8
9
function unique(array){

return Array.from(new Set(array));
}

unique([1,5,3,4,5,1,1,0]);

alert(unique);
//[1,5,3,4,0]

3. 类似第一种的转化

1
2
3
4
5
6
let arr = [1,5,3,4,5,1,1,0];

var unique = [...new Set(arr)];

alert(unique);
//[1,5,3,4,0]

暂且归纳这么多,不足之处还请不吝赐教!