利用es6中的set
利用了es6中Set方法自身的特性,数据不重复来实现去重,Set自动过滤重复元素
function unique(arr){
return Array.from(new Set(arr)) //Array.from对数组浅拷贝也可以写成[...new Set(arr)]通过...拓展运算符
}
var arr = [1,2,3,4,2,2,4,6,null,null]
console.log(unique(arr)) //[1,2,3,4,6,null]
双层循环
外层从第一项开始遍历,内层循环从而第二项开始遍历,如果两项值相等,则利用splice从原数组中去除
var arr = [1,2,3,4,3,2,5,6,2,null,null]
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)
}
}
}
console.log(arr) //[1,2,3,4,5,6,null]
利用indexOf()
利用indexOf去判断值在不在空数组中,如果不存在则则追加进空数组中
let arr = [1,2,3,4,2,4,6,7]
var res = []
for(var i = 0;i<arr.length;i++){
if(res.indexOf(arr[i])===-1){
res.push(arr[i])
}
}
console.log(res) [1, 2, 3, 4, 6, 7]
Array.filter()
利用Array.filter()方法来过滤元素,判断该元素第一次出现的位置与当前位置是否相同,相同则没重,否则重复
let arr = [1,2,3,4,3,5,3]
function unique(){
return arr.filter(function(item, index){
return arr.indexOf(item) === index;
});
}
console.log(unique()) [1, 2, 3, 4, 5]
相邻元素进行比较
用过Sort方法先进行排序相邻的进行比较,相同则重复
let arr = [1,2,6,3,2,8,4,3]
console.log(arr.sort())
arr.sort().forEach((item,index)=>{
if(item===arr[index+1]){
console.log(item,arr[index+1])
arr.splice(index,1)
}
})
console.log(arr) [1, 2, 3, 4, 6, 8]
利用对象属性去重
利用对象的键不重复的特性,建一个空对象,判断对象中是否有以当前值命名的,如果没有把当前值追加到空数组,给当前对象的这个键赋值
let res = []
let obj = {}
let arr = [1,4,7,3,8,null,4,7,1,2,null]
for(let i = 0;i<arr.length;i++){
if(!obj[arr[i]]){
res.push(arr[i])
obj[arr[i]]=true
}
}
console.log(res) [1, 4, 7, 3, 8, null, 2]
利用includes
遍历数组,创建一个空的数组,使用includes判断当前元素是否在空数组中,不存在则追加进去、
let arr = [1,2,4,6,2,5,3]
let res = []
arr.forEach(e=>{
if(!res.includes(e)){
res.push(e)
}
})
console.log(res) [1, 2, 4, 6, 5, 3]
上面的几种方法,双层循环的消耗是最多的,利用对象去重的这种方法是最快的