《数组去重的三种方法》

237 阅读1分钟

① Set + Array.from()

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

Array.from()  方法对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。

var arr = [1,1,2,2,3,3,4]

var uniq = function(x){  
    return Array.from(new Set(x))
}
uniq(arr)  //[1,2,3,4]

② map

Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

map可以保留字符串也可以保留数字 能够滤掉相同的字符串也能滤掉相同的数字 但是如果同时有 比如数字1和字符串'1' 这两个都会保留

a1 = ['1','2',3,3,4,4,5]

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

uniq(a1) //['1','2',3,4,5]

③ 计数排序的思路

这种方法的缺点:

产出的其实是字符串 想要数字就再加个parseInt

如果原数组中既有字符串又有数字 比如 "1" 和数字1 只会留两者之一

var a1 = [1,2,2,3,3]

var uniq = function(a){
    var map = {}
    for(let i=0;i<a.length;i++){
        let number = a[i]
        if(number in map){
            continue
        }
        map[number] = true
    }
    return Object.keys(map)
}

uniq(a1)  //['1', '2', '3']  产出的其实是字符串

如果不用Object.keys()


var a1 = [1,2,2,3,3]

var uniq = function(a){
    var map = {}
    for(let i=0;i<a.length;i++){
        let number = a[i]
        if(number in map){
            continue
        }
        map[number] = true
    }
    const result = []
    for(let key in map){
        result.push(key)  //这里其实还是字符串
                          //result.push(parseInt(key))  想得到数字就使用parseInt
    }
    return result
}

uniq(a1) //['1','2','3']