js 去重的十种方法

1,921 阅读3分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

大家好,我是 摸鱼小公举,真正的强者,不会怨天尤人,如果想不被别人看轻,你就只有付出比别人多十倍百倍的努力,才能站的比别人更高。上一篇文章是 算法题-找出字符串中不含有重复字符的最长子串的长度 ;今天我们来学习一下 js 去重的十种方法。

先给定一个数组

var  arr=[2,3,3,4,5,5,4,6,3]

第一种方法 利用Set

var arr2=[...new Set(arr)]
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第二种方法利用 Array.from 和 Set

var arr2=Array.from(new Set(arr))
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第三种方法利用 Map 对象

const map = new Map();
  var arr2 = [];
  for (var i = 0; i < arr.length; i++) {
    if (!map.has(arr[i])) {  //查找是否含有key
      map.set(arr[i], true)  //添加key和value
       console.log(map) 
      arr2.push(arr[i]);
    }
  }

console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第四种方法利用 Array.includes

var  arr2 = []
for (j = 0; j< arr.length; j++) {
  if(!arr2.includes(arr[j])){
   arr2.push(arr[j])
  }
}
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第五种方法利用 Array.sort

 arr = arr.sort() //[2, 3, 3, 3, 4, 4, 5, 5, 6]
    var arr2= [arr[0]]; 
    //先把第一个元素放进新数组,其次相邻两个一一对比,不相等就把当前遍历值放进新数组
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] !== arr[i-1]) {
            arr2.push(arr[i]);
        }
    }
    
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第六种方法双重循环依次对比

for (let i = 0; i < arr.length; i++) {
  for (let j = 0; j < arr.length; j++) {
      if(arr[i]===arr[j] && i!=j){ //双重循环依次对比,并且索引不一样的时候删除当前索引的值
        arr.splice(j,1)
      }
  } 
}
console.log(arr) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第七种方法利用 Array.indexOf

var  arr2 = []
for (j = 0; j< arr.length; j++) {
  if(arr2.indexOf(arr[j])==-1){
   arr2.push(arr[j])
  }
}
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第八种方法利用 Array.filter

var arr2=arr.filter((item,index)=>{
    return arr.indexOf(item)===index  //数组包含item的值则返回对应的下标
})
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第九种方法利用双重循环和开关思想

var  arr2 = []
var flag = false
for (j = 0; j< arr.length; j++) {
   for (k = 0; k < arr2.length; k++) {
      if (arr[j] == arr2[k]) {
         flag = true;
       }
    }
    if (flag == false) {
      arr2.push(arr[j])
     }
     flag = false
}
console.log(arr2)  // [2, 3, 4, 5, 6]

执行所需要时间如下

image.png

第十种方法利用 Array.sort 和 for循环 空间复杂度最低

var  arr=[2,3,3,4,5,5,4,6,3]
function uni(arr) {
let l = arr.length;
arr.sort((a, b) => a - b)
for (let i = 0; i < l; i++) {
if (arr[i] == arr[i + 1]) {
arr.splice(i, 1);
l--;
i--;
}
}
return arr;
}

console.log(uni(arr));//[2, 3, 4, 5, 6]

执行所需要时间如下

image.png

结语:

去重方法远不止这十种,这里是按照运行时间的从少到多排序的,越靠后的性能越不好,推荐使用前面两种方法代码简洁不影响性能。好了文章到此就结束了,欢迎大家( 点赞+评论+关注 ) 有问题可以来互相交流一下。希望这篇文章对大家有帮助,也希望大家多多支持我,今天是我参与2022首次更文挑战的第12天,加油!