js数组去重是学习前端js算法必备
这个是数组去重,首先得判断是不是数组,可以看我的第一片篇博客
数组?对象?只有数组需要去重
var arr = [ 1,2,3,4,3,2,3,2,1,"1","2",NaN,NaN,undefined,undefined]
es6中的Set方法
es6作为现在前端求职必备,所以放在第一个来讲,方法好在NaN在Set中是一样的
// es6的Set方法
function unique(arr) {
return Array.from(new Set(arr))
}
console.log(unique(arr)) // [1, 2, 3, 4, "1", "2", NaN, undefined]
// 简化上面代码
console.log([...new Set(arr)]) // [1, 2, 3, 4, "1", "2", NaN, undefined]
双层for循环,如果后面有前面的值,利用splice删除
但是有一个弊端,因为两个NaN默认是不一样的
function unique(arr) {
for(let i = 0; i < arr.length-1; i++) {
for(let j = i+1; j<arr.length; j++) {
if(arr[i] === arr[j]) {
arr.splice(j,1);
j--;
}
}
}
return arr
}
console.log(unique(arr)) //[1, 2, 3, 4, "1", "2", NaN, NaN, undefined]
如果已知数组中没有两个NaN,也是可以用的这个方法
indexOf + filter,indexOf,includes
indexOf会返回每一个item在数组中首次的位置,然后filter进行去重
function unique(arr) {
return arr.filter((item,index,array) => {
return index === array.indexOf(item)
})
}
console.log(unique(arr)) // [1, 2, 3, 4, "1", "2", undefined]
注意这个方法会剔除掉原数组中的NaN,得先确定原数组中没有NaN才可以用这个方法
或者直接用indexOf,将返回的第一次出现的位置的数push到另一个数组中
function unique(arr) {
let array = []
arr.forEach(item => {
if(array.indexOf(item) === -1) {
array.push(item)
}
})
return array
}
console.log(unique(arr)) // [1, 2, 3, 4, "1", "2", NaN, NaN, undefined]
仔细看这里又出现了两个NaN,对比上面的就是filter这个方法过滤掉了NaN
再来对比一下includes
function unique(arr) {
let array = []
arr.forEach(item => {
if(!array.includes(item)) {
array.push(item)
}
})
return array
}
console.log(unique(arr)) // [1, 2, 3, 4, "1", "2", NaN, undefined]
在方法上和indexOf很类似,indexOf是检查首次出现的位置,includes是判断item是否存在某个数组中,这里NaN检索后只出现一次
reduce + includes
function unique(arr) {
return arr.reduce((prev,cur) =>
prev.includes(cur) ? prev : [...prev,cur],[])
}
console.log(unique(arr)) // [1, 2, 3, 4, "1", "2", NaN, undefined]