JS 数组去重

数组去重

1. indexOf()

将原始数组中的数据,写入到新的数组中,如果新数组中,没有这个数据,我们在进行写入操作。indexOf()结果是 -1。

var arr=[1,1,1,2,2,2,3,3,3,4,4,5,5,6,6];
var arr2=setNewArr(arr);
console.log(arr2);
//参数是需要执行去除重复数据的数组
function setNewArr(arr){
	var newArr=[ ];
	arr.forEach(function(val){
		if( newArr.indexOf(val) == -1){
				newArr.push(val);
			}
		})
	return newArr;
} 

2. 使用双层for循环

使用双层for循环,来完成对数组中数值的比较;如果数值相同,就删除其中一个数值;如果要是数值相同就删除之后的数值;循环次数比较多。

var arr123=[1,2,3,4,1,2,3,4,1,2,3,4,5];
function setNewArr2(arr){	
	for(var i=1;i<=arr.length-1;i++){	
	// 外层循环,从第一个数值开始,循环至最后一个数值
		for(var j=i+1;j<=arr.length-1;j++){ 	
		// 内层循环,从当前起始数值的下一个数值开始,循环至最后一个数值
			if(arr[i] === arr[j]){
			// 执行删除数组单元操作,之后的单元,会前移,顶替当前位置的单元
            // 此时,当前位置就是放置了一个新的单元
            // 这个位置就必须要重新操作一次,判断数值是否相同
				arr.splice(j,1);
				j -- ;
			 // 先将循环生成的索引--, 在执行循环的++
             // 等于操作之后,索引值没有变,下次循环,执行的对象,仍然是当前这个单元	
			}
		}
	}
	return arr;
}
var newArr = setNewArr2(arr123);
connsole.log(newArr);

总结:
循环操作数组,只要执行了删除数组单元的操作,一定要将循环变量数值 执行 – 操作。

3. 先排序后删除

先将数组中的数值,按照大小顺序,排列;排序之后,相同的数值,一定是相邻的;此时,只要相邻的两个数值比较,如果相同,删除后一个数据,再执行 i–;使用一层循环就可以了;循环次数就比较少。

var arr = [1,2,3,4,5,1,2,4,5,1,2,3,4,5];
var newArr=setNewArr3(arr){
	var newArr=arr.sort(function(a,b){return a-b});// 先对数组进行排序操作,相同数据,相邻
	console.log(newArr);
	// 当前数据与下一个数据比较
    // 冒泡排序的优化原理:只要循环到倒数第二个单元
    // 就会通过i+1 与最后一个单元比较
    // 比较到最后一个单元,循环只要执行到,倒数第二个单元
	for(var i=0;i<=newArr.length-1-1;i++){
		if(newArr[i] === newArr[i+1]){
			newArr.splice(i+1,1);	// 删除后一个单元
			i--;	// 防止数组坍塌,造成有单元没有执行操作
		}
	}
	return newArr;
}

4. 利用对象的属性,来完成数组去重

对象的属性特点:一个对象中,相同的键名,只能建立一个;再对已经存在的键名进行赋值,是修改数据操作。

//数组中,已经有两个单元,所以是0,1;新建立单元,索引就不能是0,1。
var arr=['北京','上海'];
console.log(arr);
var obj={name:'张三'};
// 不会新建一个对象中的单元,键名是name
// 会将李四数据,覆盖以后的name键名存储的数据
obj.name='李四';
console.log(obj);
var arr1=[1,1,1,2,2,3,3,4,4,5,5];
console.log(arr1);
// 获取第一个单元的数值1,作为对象的键名,建立一个单元
// var obj1 = { 1:'随便' };
// 获取第二个单元的数值,还是1,还作为对象的键名
// 此时1键名已经存在,会执行覆盖操作,不会新增一个单元
// obj1 = { 1:'随便' };
// console.log(obj1);
var obj1={};
var newArr=[];
arr1.forEach(function(val){
	obj1[val]='你好!';
})
console.log(obj1);
for(var attr in obj1){	// for...in循环对象,自定义变量中存储的是对象单元的属性
	newArr.push(attr);	// 将属性attr存储的数据写入新数组中
}
console.log(newArr);

总结:

  1. 将数组的数值,作为对象的属性/键名;利用对象不能有重复 属性/键名 的特点,去除数组重复数据;重复数据,不会生成新的 对象的属性/键名。
  2. 将对象的 属性/键名 写成新数组的数据。

在这里插入图片描述

数组的坍塌

什么是数组的坍塌?
一个数组,我们循环遍历这个数组
for(var i = 0 ; i <= arr.length-1 ; i++){}		//循环终止
一个数组,我们循环遍历这个数组
for(var i = 0 ; i <= arr.length-1 ; i++){	//循环终止
	if( i == 2 ){ arr.splice( i , 1 ) }	
	//当 i 为2 时,执行删除数组单元操作;删除索引是当前 i 的值 也就是 2 的单元
}	//i为2,触发条件,执行删除操作
一个数组,我们循环遍历这个数组
for(var i = 0 ; i <= arr.length-1 ; i++){	//循环终止
	if( i == 2 ){ arr.splice( i , 1 ) ; i--;}	//触发条件,删除单元,数组坍塌
}	//在执行删除语句后,执行 i-- 操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值