如何实现数组去重?

138 阅读1分钟

假设有数组 array = [1,5,2,3,4,2,3,1,3,4]
你要写一个函数 unique,使得
unique(array) 的值为 [1,5,2,3,4]
也就是把重复的值都去掉,只保留不重复的值。


用Set实现

Set数据结构,其成员都是唯一的,我们可以这样实现数组去重

function unique(array){
 return Array.from(new Set(array));
}
unique([1,5,2,3,4,2,3,1,3,4])//[1,5,2,3,4]

优点:这个方法代码量最少 缺点:对象无法去重,而且这个API比较新,一些旧的浏览器可能会不支持

Map支持对象去重

要实现数组去重,我们可以创建一个Map,然后遍历数组,因为Map中不会出现相同的值,所以我们可以得到去重之后的效果

unique = (arr) => {
  let hashMap = new Map();
  let result = new Array(); 
  for (let i = 0; i < arr.length; i++) {
    if(hashMap.has(arr[i])) { // 判断 hashMap 中是否已有该值
      hashMap.set(arr[i], true);  // true重复
    } else {  // 如果 hashMap 中没有该值,添加到新的数组中
      hashMap.set(arr[i], false);  
      result.push(arr[i]);
    }
  } 
  return result;
}
 
unique([1,5,2,3,4,2,3,1,3,4])//[1,5,2,3,4]

此时打出unique(arr)的值为[1,5,2,3,4]

缺点:对象无法去重;而且这个方法的API也很新,一些旧的浏览器会不支持。

利用indexOf去重

新建一个空数组,for循环原数组,判断结果数组是否存在当前元素,如果有相同的值则跳过,不同则push进数组。

unique = (arr) => {
 let array = [];
   for (let i = 0; i < arr.length; i++) {
     if (array .indexOf(arr[i]) === -1) {
     array.push(arr[i])
     }
   }
 return array;
}
let arr = [1,5,2,3,4,2,3,1,3,4];
unique([1,5,2,3,4,2,3,1,3,4])//[1,5,2,3,4]

缺点:对象和NaN无法去重