js中数组去重的几种方式

第一种方法(两两比较)

  • 让数组中每个数值跟每个数值比较,如果两值相等(注意此处比较要用到’===’,以防数值是字符串),删除后面的数值(此处删除用到arr.splice(j,1)方法,j是后面数值的索引),但是这个时候原数组的长度会减小一,将j–可解决这个问题。
var arr = [1,1,1,2,2,1];
			//第一种方法(两两相比 如果相等删除后面的)
			function norepeat(arr){//形参arr和全局变量arr没有关系
				for(var i = 0; i < arr.length - 1; i++){
					for(var j = i+1; j < arr.length; j++){
						if(arr[i]===arr[j]){
							arr.splice(j,1);//删除元素之后,原数组是要发生改变的,j正常累加,会有遗漏
							j--;
						}
					}
				}
				return arr;
			}

第二种方法(排序比较)

*先用sort()方法将数组排序,使相同的值在一起,然后将相邻的值依次进行比较判断是否相等(arr[i]===arr[i+1]),两值相等就删除判断的第二个值,原数组发生变化依然用第一种去重中的方法解决。

//第二种方法(先将数组排序,然后第一位和后面一位比较)
		
			
			var arr = [1,1,1,2,2,2]
			function norepeat(arr){
				arr.sort();//相同的元素放到一起
				for(var i = 0; i < arr.length - 1; i++){
					if(arr[i]===arr[i+1]){//两两比较
						arr.splice(i+1,1);
						i--;
					}
				}
				return arr;
			}

第三种方法(创建空对象)

  • 结合数组和对象实现数组去重,可以把数组中的元素看成是对象的属性,利用对象里有访问一个不存在的属性,默认取到undefined的原理,在一个空对象中依次取数组中的值,如果得到undefined就说明对象中不存在这个值就将此值放入对象中,若不是undefined说明对象中已经存在此值则不加入对象中,最后返回的对象就是去重的结果。
var arr1 = ["a","a","b","a","c"];
			function norepeat(arr){
				var newArr = [];//放不重复的元素的
				var obj = {};
				
				for(var i = 0; i < arr.length; i++){
					if(obj[arr[i]]===undefined){
						obj[arr[i]] = 1;
						newArr.push(arr[i]);
					}
				}
				
				return newArr;
			}

第四种方法(indexOf())

  • 利用数组新增方法indexOf(n)返回n在数组中的索引,没有索引返回-1这一原理,新建一个空数组newArr,遍历需要去重的数组arr,如果arr中的值在newArr中取索引为-1,则说明newArr中还没有这个值,将这个值加到newArr中,若不为-1,就不加,最后返回的newArr就是去重结果。
function norepeat(arr){
 				var newArr = [];
 				for(var i = 0; i < arr.length; i++){
 					if(newArr.indexOf(arr[i])==-1){
 						newArr.push(arr[i]);
 					}
 				}
 				return newArr;
 			}
 			console.log(norepeat(arr));

第五种方法(set())

  • 在ES6的基础用法中有个set结构,这是一种新的数据结构,类似数组,它有个特性就是构造函数值不能重复,利用这一特性就能实现数组去重。
var arr=[1,2,5,5,1,6];
let set = new Set(arr);
let newArr=[...set];//函数扩展
console.log(newArr);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值