Yapei Li

专注于前端领域

0%

js基础7、数组去重

数组去重

方法一

1、依次拿出数组中的每一项(排除最后一项:最后一项后面没有需要比较的内容)

2、和当前拿出项后面的每一项依次比较

3、如果发现有重复的,我们把找到的这个重复项原数组中删除掉(splice)

4、i-- 防止数组塌陷

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 arr=[1,2,3,2,3,4,3,4,5]

//方法一
/**
*1、依次拿出数组中的每一项(排除最后一项:最后一项后面没有需要比较的内容)
*2、和当前拿出项后面的每一项依次比较
*3、如果发现有重复的,我们把找到的这个重复项在原数组中删除掉(splice)
*/

//=>arr.length-1 不用拿最后一项
for(var i=0;i<arr.length-1;i++){
var item =arr[i];
//item依次拿出每一项
//i:当前拿出项的索引
//和当前拿出项后面的每一项比较:起始索引为i+1
for(var j=i+1;j<arr.length;j++){
if(item === arr[j]){
arr.splice(j,1);
//这样会导致数组塌陷问题:当我们把当前项删除后,后面每一项都要向前进一位,也就是原有数组的索引发生了改变,此时我们j继续累加1下次拿出来的结果就会跳过一位
//所以删除后先--,再++时相当于没减
i--;
}
}
}
console.log(arr) //[1,2,3,2,4,5]

方法2:基于对象的属性名不重复来实现高性能的数组去重

1、创建一个空对象

2、依次遍历数组中的每一项,把每一项存储的值,当做对象的属性名和属性值存储起来

3、在存储之前我们先判断当前对象中是否已经存在这个属性名了,如果存在,说明之前有这一项存储的操作,说明重复了,此时我们把当前项在数组中删除即可

4、i-- 防止数组塌陷

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
26
27
28
29
30
31
32
33
//方法2:基于对象的属性名不重复来实现高性能的数组去重
//1、创建一个空对象
//2、依次遍历数组中的每一项,把每一项存储的值,当做对象的属性名和属性值存储起来
//
//3、在存储之前我们先判断当前对象中是否已经存在这个属性名了,如果存在,说明之前有这一项存储的操作,说明重复了,此时我们把当前项在数组中删除即可
//
//如何判断对象中是否存在这个属性:如果没有获取到的是undefined
//
//
var arr=[1,2,3,2,3,4,3,4,5]
var json={};
for(var i=0;i<arr.length;i++){
var item=arr[i];
//json[item]!==undefined 可以
if(typeof json[item]!=='undefined'){
/*
*arr.splice(i,1)
*i--; //防止数组塌陷
*
*这种不太好,我们每删除一项,后面的索引都需要重新计算,非常耗性能
*/
/*
*1、我们把数组最后一项的结果获取到,替换当前项的内容
*2、把数组最后一项删除
*/
arr[i]=arr[arr.length-1];
arr.length-1;
i--;
continue;
}
json[item]=item;
}
console.log(arr)

方法三、Array.from(new Set(arr))

1
2
3
4
5
//方法三、不考虑兼容ES6
var arr=[1,2,3,2,3,4,3,4,5]
//new Set(arr) {1,2,3,4,5}
var arr2=Array.from(new Set(arr))
console.log(arr2) //[1,2,3,4,5]