去重详解

本文介绍五种有效的数组去重方法,包括使用for循环、indexOf、sort、原型方法及对象属性特性,每种方法都有其适用场景和局限性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说一下 == 和 === 区别
=== 严格相等,会比较两个值的类型和值== 抽象相等,比较时,会先进行类型转换,然后再比较值
一、利用for嵌套for,然后splice去重(ES5中最常用)
用双重for循环把前一个和所有后面的元素进行比较,如果相等则删除 缺点:如果数组长度很大,效率会很低
这个方法需要注意要j–
否则如果数组里面有三个及以上连续相等的元素的时候,就会出现问题。例如:var arr = [1,1,1,2,3,4,‘a’,‘b’,‘a’,false,false];答案就会为1,1,2,3,4,a,b,false。
这里是因为当数组删除一个元素的时候,数组长度减1,后面点元素就会往前移动一位,索引也减1,但是j还是进行了j++的操作。

	// function unique(arr){
	// 	for(var i = 0; i < arr.length;i++){//外层循环元素
	// 		for(var j = i+1; j < arr.length;j++){//内层循环比较赋值
	// 			if(arr[i] === arr[j]){
	// 				arr.splice(j,1);
	// 				j--; // splice 会改变数组长度,所以要将下标 j 减一
	// 				//也可以两步结合写成 arr.splice(j--,1);先比较(运算)再减
					
	// 			}
	// 		}
	// 	}
	// 	return arr;
	// }

二、利用indexOf去重
* 新建一新数组,遍历传入数组,值不在新数组就push进该新数组中

	IE8以下不支持数组的indexOf方法
	// function unique(arr){
		// 	if(!Array.isArray(arr)){
		// 		console.log('type error!')
		// 		return
		// 	}
		// 	var  newArr = [];//创建一个新的空数组,用来存放去重后的新数组.
		// 	for(var i = 0; i < arr.length;i++){//利用for循环循环遍历需要去重的数组
		// 		if(newArr.indexOf(arr[i]) === -1){//利用indexOf()方法查询遍历出的数组在新数组中是否出现,如果出现:则继续遍历数组,如未出现:则利用push方法添加到新数组中 注意此处的括号不要搞错位置了呀呀
		// 			newArr.push(arr[i]);
		// 		}
		// 	}
		// 	return newArr;
		// }

三、利用sort()加一行遍历冒泡(相邻元素去重)
这种方法首先调用了数组的排序方法,sort() ,然后根据排序后的结果进行遍历及相邻元素进行比对,如果相等则跳过改元素,直到遍历结束。

		// function unique(arr){
		// 	if(!Array.isArray(arr)){
		// 		console.log('type error!')
		// 		return
		// 	}
		// 	arr  = arr.sort();
		// 	var newArr= [];
		// 	for(var i = 0; i < arr.length;i++){
		// 		if(arr[i] != arr[i-1]){
		// 			newArr.push(arr[i])
		// 		}
		// 	}
		// 	return newArr;
		// }

四、利用原型方法来过滤数组中的重复元素。

	 // Array.prototype.unique = function(){
    	//     	var temp=[];    //定义一个临时数组
	   //      	for(var i = 0; i < this.length; i++){    //循环遍历当前数组
	   //          //判断当前数组下标为i的元素是否已经保存到临时数组
	   //          //如果已保存,则跳过,否则将此元素保存到临时数组中
	   //          	if(temp.indexOf(this[i]) == -1){
	   //             	 	temp.push(this[i]);
	   //          	}
		  //       }
		  //       return temp;
		  //   };

五、对象属性名唯一特性的方法:

			Array.prototype.unique = function(){
			if (Array.isArray(arr)) {
			    var temp = [];
			    var temNum = {};
			    for (var i = 0; i < arr.length; i++) {
			        if(!temNum[arr[i]]) {
			            temp.push(arr[i]);
			        }
			        temNum[arr[i]] = true;
			    }
			    return temp;
			}
			return;

			}

var arr = [1,1,1,2,3,4,‘a’,‘b’,‘a’,false,false,‘true’,true];//1,2,3,4,a,b,false,true
//console.log(unique(arr));
//console.log(arr.unique());
以后再补充 有不对的欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值