方法一
- 依次拿出数组中的每一项(
排除最后一项
:最后一项后面没有需要比较的内容) - 和当前拿出项
后面的每一项
依次比较
- 如果发现有重复的,我们把找到的这个
重复项
在原数
组中删除
掉(splice) i--
防止数组塌陷
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:基于对象的属性名不重复来实现高性能的数组去重
- 创建一个
空对象
- 依次遍历数组中的每一项,把每一项存储的值,当做对象的属性名和属性值存储起来
- 在存储之前我们
先判断当前对象中是否已经存在这个属性名
了,如果存在,说明之前有这一项存储的操作,说明重复了,此时我们把当前项
在数组中删除
即可 i--
防止数组塌陷
//方法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) //[1,2,3,4,5]
方法三、Array.from(new Set(arr))
//方法三、不考虑兼容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]
方法四、arr.reduce(function(accumulator,currentValue,currentIndex,array){}, initialValue)
let arr = [1,2,1,2,3,5,4,5,3,4,4,4,4];
//arr.sort先将重复的放在一起[ 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 5, 5 ]
//所以只要重复 init最后一个(`init[init.length-1]`)肯定和下一个相等
// init 第1次循环时是 [],current 第1次循环时是 1
// init 第2次循环时是 [1],current 第2次循环时是 1
// init 第3次循环时是 [1],current 第3次循环时是 2
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]