JavaScripts基础(7)数组去重

574 阅读1分钟

数组去重

方法一

  1. 依次拿出数组中的每一项(排除最后一项:最后一项后面没有需要比较的内容)
  2. 和当前拿出项后面的每一项依次比较
  3. 如果发现有重复的,我们把找到的这个重复项原数组中删除掉(splice)
  4. 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:基于对象的属性名不重复来实现高性能的数组去重

  1. 创建一个空对象
  2. 依次遍历数组中的每一项,把每一项存储的值,当做对象的属性名和属性值存储起来
  3. 在存储之前我们先判断当前对象中是否已经存在这个属性名了,如果存在,说明之前有这一项存储的操作,说明重复了,此时我们把当前项在数组中删除即可
  4. 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]