数组去重的几个方法

361 阅读1分钟

1.不用 Set 实现

借鉴计数排序的原理来实现
缺点:代码复杂程度高,只支持数字或者字符串数组,如果数组里面有对象,比如 array = [{number: '1'}, 2],就会出错。

unique = (array) => {
    let hashTable = {}, max = 0; result  = []
    for(let i=0; i<array.length; i++){
        if(!(array[i] in hashTable)){
            hashTable[array[i]] = 1
        }else{}
        if(array[i] > max) {max = array[i]}
    }
    for(let j=0; j<=max; j++){
        if(j in hashTable){
            result.push(j)
        }
      }
      return result
}

let array = [1,5,2,3,4,2,3,1,3,4]
unique(array) // [1,5,2,3,4]

2.用 Set 实现

缺点:API 太新,旧浏览器不支持。

unique = (array) => {
    return Array.from(new Set(array))
    //return [...new Set(array)]
}

let array = [1,5,2,3,4,2,3,1,3,4]
unique(array) // [1,5,2,3,4]

3.用 Map 实现

Map.prototype.set() 方法向 Map 对象实例添加一个指定键和值的键值对。
如果指定键已经存在 Map 对象中,那么将用新的值对旧值进行覆盖。
因此创建一个空Map数据结构,遍历需要去重的数组,把数组的每一个元素作为key存到Map中。
由于Map中不会出现相同的key值,所以最终得到的就是去重后的结果。

缺点 :API太新,旧浏览器不支持。

unique = (arr) =>{
    let map = new Map();
    let newArr = [];
    for (let i = 0; i < arr.length; i++) {
        if (!map.has(arr[i])) {
            map.set(arr[i], true);
            newArr.push(arr[i]);
        }
    }
    return newArr
}

let arr = [1,1,3,3,2,2]
const newArr = unique(arr)
console.log(newArr) // [1,3,2]

这是利用 Map 的两个方法 has 和 set 来判定数组中的每个元素(循环判定是否有该元素,没有的时候,set该元素为true,新数组再添加)