数组去重的方法

前言

数组去重经常是面试被问到的很经典的问题之一。
这里总结一下比较简洁的几种方法。

前提:
1.去重后必须还是数组类型
2.考虑NaN的情况(JS中NaN和NaN不等,但这里当做相等并去重处理)
3.不考虑兼容性

new Set()

这是最优解。ES6语法。

1
2
3
4
function unique(arr){
return [...new Set(arr)]
}
unique(['1','',0,10,'str',1,1,1,2,NaN,NaN]) //["1", "", 0, 10, "str", 1, 2, NaN]

或者

1
2
3
4
function unique(arr){
return Array.from(new Set(arr))
}
unique(['1','',0,10,'str',1,1,1,2,NaN,NaN]) //["1", "", 0, 10, "str", 1, 2, NaN]

缺点:不适用于包含对象类型的数组

indexOf

创建新数组,遍历数组是否存在于新数组中,如果不存在就添加到新数组。
其中用了ES6的for…of,换成for循环同样适用。
网上有用到indexOf判断数组中是否存在某值的,但indexOf不够语义化,且不能判断是否存在NaN

1
2
3
4
5
6
7
8
9
10
function unique1(arr){
let newArr = []
for(let val of arr){
if(!newArr.includes(val)){
newArr.push(val)
}
}
return newArr
}
unique1(['1','',0,10,'str',1,1,1,2,NaN,NaN]) //["1", "", 0, 10, "str", 1, 2, NaN]

缺点:不适用于包含对象类型的数组

0%