数组去重十种方法

定义一个数组和一个新的空数组

var arr = [1,'true','dpn',1,2,'3',3,'false','dpn',1,'leave']
var arr1 = []

1、indexof

arr.forEach((element) => {
	if(arr1.indexOf(element) == -1) {
		arr1.push(element)
	}
});
 console.log(arr1)

2、双重for循环

for (let i = 0; i < arr.length; i++) {
	for (let j = i+1; j < arr.length; j++) {
		if (arr[i] === arr[j]) {
			 arr.splice(j,1)
		}
	} 
}
console.log(arr)

3、includes

arr.forEach((element) => {
   if(!arr1.includes(element)) {
   	  arr1.push(element)
    }
});
console.log(arr1)

4、filter

indexOf第二个参数意思是:从哪里开始查:

从0开始查element这个元素,如果	有就会返回该元素的index索引值
因为element是从前往后,所以如果有重复的元素,那么从前往后查找的时候就会返回前		面已经存在的元素的索引值
就不满足return的条件(返回该元素的索引) 以此来进行去重
var arr2 = arr.filter((element,index) => {
    return arr.indexOf(element, 0) === index;
})
console.log(arr2)

5、sort()

arr = arr.sort()
for (let i = 0; i < arr.length; i++) {
    if(arr[i] === arr[i+1]) {
   	arr.splice(i,1)
   	
       splice(i,1)删除该index元素后
       元素的index整体都-1了(因为删除后这个位置没有了,后面的向前移)
       原来index=1的就变成了index=0
       但是for循环的 i 已经到了 i+1 (后一位)了
       所以要把整体的这个 i-1,才能匹配到下一个元素,不然就漏了一个
       
        i--
   	} 
}
console.log(arr)

6、利用递归
利用函数的递归调用进行循环校验 以此去重

先进行排序更好去重
arr = arr.sort()
function loop (index) {
   if (index >= 1) {
   	if(arr[index] === arr[index-1]) {
   		arr.splice(index, 1)
   	}
   	loop(index-1)
   }
}
loop(arr.length-1)
console.log(arr)

7、利用reduce + includes

arr = arr.reduce((previousValue, currentValue) => {
   if (!previousValue.includes(currentValue)) {
   
    如果previousValue(上次返回的数组)中存在currentValue(当前的元素)
    就说明有重复,就不添加
	取反  表示没有重复,就把这个中存在currentValue添加进去
	然后把previousValue返回出去
	
   	 return previousValue.concat(currentValue);
   }
   return previousValue;
}, [])

注意: 
reduce 的第二个参数 reduce(()=> {}[]) 是指 previousValue 第一次迭代的值,必须提供一个空数组,
不然默认会以 arr 数组中的第一个数组元素当作第一次迭代的 previousValue 值。
       
console.log(arr)

8、利用ES6 Set去重 (有兼容性)
Set类似于数组(伪数组):没有重复的值 Set是构造函数,返回一个Set实例
Array.from()把一个伪数组变成真正的数组

console.log(Array.from(new Set(arr)))

9、利用Map数据结构去重

let map = new Map()
for (let index = 0; index < arr.length; index++) {
	const element = arr[index];
	
	校验map中是否存在遍历到的这个元素

	如果不存在就添加这个元素到map中,并设置他的value
	(这里的truefalse只是一个区别的flag)
	并添加到新的数组arr1中
	
	if (!map.has(element)) {
     	map.set(element, true)
    	 arr1.push(element)
    }
}
得到新数组arr1就是去重之后的数组
console.log(arr1)

10、利用对象特性去重

var obj = {}
for (let index = 0; index < arr.length; index++) {
	const element = arr[index];
	if (!obj[element]) {
		obj[element] = 1
		arr1.push(element)
	 }
}

1-9的方法去掉的重复的是值和数据类型都重复的元素
第10种去掉的重复是值重复的元素
(eg:3、’3‘)因为值一样也会被当作重复元素被去掉

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值