定义一个数组和一个新的空数组
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
(这里的true和false只是一个区别的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‘)因为值一样也会被当作重复元素被去掉