likes
comments
collection
share

js 去重的十种方法

作者站长头像
站长
· 阅读数 27

「这是我参与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]

执行所需要时间如下

js 去重的十种方法

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

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

执行所需要时间如下

js 去重的十种方法

第三种方法利用 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]

执行所需要时间如下

js 去重的十种方法

第四种方法利用 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]

执行所需要时间如下

js 去重的十种方法

第五种方法利用 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]

执行所需要时间如下

js 去重的十种方法

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

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]

执行所需要时间如下

js 去重的十种方法

第七种方法利用 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]

执行所需要时间如下

js 去重的十种方法

第八种方法利用 Array.filter

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

执行所需要时间如下

js 去重的十种方法

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

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]

执行所需要时间如下

js 去重的十种方法

第十种方法利用 Array.sort 和递归

 function loop(index){
   if(index >= 1){  //当index < 1 时就会停止调用
     if(arr[index] === arr[index-1]){  //当前索引的值如果与前一个索引值相等就删除当前索引值
        arr.splice(index,1);
     }
     loop(index - 1);    //递归loop,然后数组去重
    }
}
loop(arr.length-1);//最大索引index
console.log(arr2) // [2, 3, 4, 5, 6]

执行所需要时间如下

js 去重的十种方法

结语:

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