著名面试题: 如何实现数组去重? 假设有数组 array = [1,5,2,3,4,2,3,1,3,4] 你要写一个函数 unique,使得 unique(array) 的值为 [1,5,2,3,4] 也就是把重复的值都去掉,只保留不重复的值。
方法一:利用indexOf去重
function unique(arr) {
if(!Array.isArray(arr)) {
console.log('type error!')
return
}
let array = []
for(let i = 0; i < arr.length; i++) {
if(array.indexOf(arr[i]) === -1) {
array.push(arr[i])
}
}
return array
}
缺点: 无法做到NaN去重。
方法二: 利用Map数据结构去重
function unique(arr) {
let map = new Map()
let array = new Array()
for(let i = 0; i < arr.length; i++) {
if(map.has(arr[i])) {
map.set(arr[i], true)
} else {
map.set(arr[i], false)
array.push(arr[i])
}
}
return array
}
缺点: API太新, 旧浏览器不支持。
方法三: 借鉴计数排序的原理
unique = (array) => {
const hash = []
for(let i=0;i<array.length; i++){
hash[array[i]] = true
}
const result = []
for(let k in hash){
result.push(k)
}
return result
}
缺点:只支持数字或者字符串数组,如果数组里面有对象,比如 array = [{number:1}, 2],就会出错。
方法四: 使用Set
function unique(arr) {
return Array.from(new Set(arr)) // 利用Array.from将Set结构转换成数组
}
// 上述代码也可以简化为:
[...new Set(arr)]
缺点:API太新,旧浏览器不支持。
方法五: 支持对象去重
function unique(arr) {
const map = new Map()
return arr.filter( item => !map.has(JSON.stringify(item)) && map.set(JSON.stringify(item), 1))
}
待补充。。