数组去重是一个比较常见的问题,要实现的方式也挺多的,今天总结几个比较简单的方式。
一、使用计数排序的原理
function unique(arr) {
let result = []
let hash = {};
for (let i = 0; i < arr.length; i++) {
if (!hash[arr[i]]) {
hash[arr[i]] = true
result.push(arr[i])
}
}
return result
}
const arr = [3, 2, 54, 3, 43, 23, 2]
console.log(unique(arr)) //[3,2,54,43,23]
缺点:只支持数字或字符串数组,如果数组中有对象就会出错。
二、使用 Map 对象
function unique(arr){
let result = []
let map = new Map()
for(let i = 0;i<arr.length;i++){
if(!map.get(arr[i])){
map.set(arr[i],true)
result.push(arr[i])
}
}
return result
}
const arr = [3, 2, 54, 3, 43, 23, 2]
console.log(unique(arr)) //[3,2,54,43,23]
其实这种方式和上面的计数排序原理差不多,但是使用 Map 对象会更加方便,这种方式的优点是除了可以去除一般数据类型的数据外,还可以去掉两个NaN,虽然 NaN 并不等于 NaN ,但是在 Map 对象中,NaN 之间是被认为相等的,缺点是不能去掉内容一致的对象,例如不能去掉两个重复的空对象,因为两个空对象的存储地址并不相等,除此之外,由于 Map 比较新,因此旧的浏览器不支持。
三、使用 Set 对象---最简单
function unique(arr){
return Array.from(new Set(arr));
}
const arr = [3, 2, 54, 3, 43, 23, 2]
console.log(unique(arr)) //[3,2,54,43,23]
这种方式最简单,优缺点与上述使用 Map 基本一致,可以去除两个 NaN,不能去掉内容一致的对象,但是 api 比较新,旧的浏览器应该不支持。
Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。要了解更多关于 Set 的内容,可通过这个 传送门(mdn)
欢迎大家留言讨论。