手写数组去重

42 阅读1分钟

使用Set

var a1 = [1,2,3,3,2,1]
var uniq = function(a){
    return Array.from(new Set(a))
    // or
    return [...new Set(a)]
}
uniq(a1)
[1, 2, 3]

使用计数排序的思路

var a1 = [1,2,3,3,2,1]
var uniq = function(a){
    var map = {}
    for (let i=0; i<a.length; i++){
        let number = a[i]
        if(number === undefined){continue}
        if(number in map){continue}
        map[number] = true
    }
    const result = []
    for(let key in map){
        result.push(key)
    }
    return result
}
uniq(a1)
['1', '2', '3']

缺点

只支持字符串,因为普通对象的key只支持字符串和Symbol,所以这个方法只能把数字转换为字符串。
当然,也可以通过parseInt()转换,但是当我们同时存在数字1和字符串1时,就无法区分了。如下:

var a1 = ['1',2,3,1,2]
uniq(a1)
['1', '2', '3']
// '1' 和 1 应该是不同的,但是这里却按照相同的处理了。

使用 Map完美解决

var a1 = ['1',2,3,3,2,1]
var uniq = function(a){
    var map = new Map()
    for (let i=0; i<a.length; i++){
        let number = a[i]
        if(number === undefined){continue}
        if(map.has(number)){continue}
        map.set(number,true)
    }
    return [...map.keys()]
}
uniq(a1)
['1', 2, 3, 1]