一个数组去重看出你的技术广度和深度

70 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情

前言:工作中经常会用到数组去重的场景,因此需要熟练的去掌握去重的方法,下面是一些方法来讲解如何数组去重。

1.两个for循环

缺点:对象和 NaN 不去重 注意: splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一 方法笨拙,如果数组长度很大,效率会很低

 var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
      for (let i = 0, len = num.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
          if (num[i] == num[j]) {
            num.splice(j, 1);
            len--;
            j--;
          }
     }
}    

2.filter + indexOf

思路:利用indexOf检测元素在数组中第一次出现的位置是否和元素现在的位置相等 注意: 对象不去重 ,NaN 会被忽略掉 indexOf 底层使用的是 === 进行判断,使用 indexOf 查找不到 NaN 元素 arr.indexOf(NaN); // -1

  var num = [1, 2, 3, 4, 5, 6, 6, 6, 5];
      num = num.filter((item, index) => {
        return num.indexOf(item) == index;
      }); 

3.for循环+indexof

 let newArr = [1,2,4,5,6,6]
 for (var i = 0, len = arr.length; i < len; i++) {
    if (newArr.indexOf(arr[i]) == -1) {
     newArr.push(arr[i])
  }
 }

4.sort()排序 + for循环

思路:利用sort方法用于从小到大排序,再判断相邻位置是否有相同的 注意:Set可以去重NaN类型,不去重对象

var num = [1, 2, 6, 4, 5, 6, 3, 6, 5];
num = num.sort();
var s=[];
for(let i=0,len=num.length;i<len;i++){
   if(num[i]!=num[i+1]){
     s.push(num[i])
 }
}

5.Es6的... + new set()

注意:对象不去重 NaN 去重 思想: ES6 提供的数据结构 Set,它一个特性就是成员值都是唯一的,没有重复的值。

 var num = [1, 2, 6, 4, 5,8, 6, 3, 6, 5,7,8,9];
 num = [...new Set(num)];

6.利用Map去重

  function duplicateRemoval(arr: any[]) {
    let map = new Map()
    let 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
  }
  let arr = [1, 2, 6, 4, 5, 8, 6, 3, 6, 5, 7, 8, 9]
  duplicateRemoval(arr)

如果有错误或者不严谨的地方,请务必给予指正,十分感谢。