js数组去重效率——Map,Set是最高的吗

这篇文章初衷是想探索去重效率,真的是Map,Set最高?实际开发中用哪些最快?
我一次性写好下面的测试数据和方法(可粘贴后在Node环境直接跑)

测试结果

结论:unique,uniqueBySet,uniqueByMap是值得推荐使用的。

10万级别结果:

过程:测试了三组数据(防止样本重复不足的偏差)
结论:个人习惯用的自定义 unique方法(原理是hash+reduce)基本和Set,Map,Sort效率同级别:unique>unqiueBySet>unqiueByMap>uniqueBySort ;第二阶梯是uniqueByFilter和uniqueByIncludes其效率相比极其低。用百万级数据测试更明显。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

百万级别结果:

由于后面两个放法实在太久了,就只测试了一次;结论前四种放法,时间基本也只是10万级别数据的10倍,而最后两个,则是100+倍;
在这里插入图片描述

let testArr=[]

// console.log('===百万级别测试===')
// for(let i=0;i<1000000;i++){
//   testArr.push(Math.floor(1000000*Math.random()))
// }
console.log('===10万级别测试===')
for(let i=0;i<100000;i++){
  testArr.push(Math.floor(100000*Math.random()))
}

function unique(arr){
  let hash= arr.reduce(((hash,a)=>{
       if(!hash[a]){
           hash[a]=true
       }
       return hash
   }),{})

   var retArr = []
   for (var key in hash) {
       if (hash[key]) {
           retArr.push(parseInt(key))
       }
   }
   return retArr


}


function uniqueBySet(arr) {
  return Array.from(new Set(arr))
}

function uniqueByMap(arr){
  let retArr=[]
  let map=new Map()
  for(let i=0;i<arr.length;i++){
    if(!map.get(arr[i])){
      map.set(arr[i],1)
      retArr.push(arr[i])
    }
  }
  return retArr
}

function uniqueBySort(arr){
  let retArr=[]
  arr.sort()
  for(let i=0;i<arr.length;i++){
    if(arr[i]!=retArr[retArr.length-1]){
      retArr.push(arr[i])
    }
  }
  return retArr

}


function uniqueByFilter(arr){
  return arr.filter((item,index)=>{
    return arr.indexOf(item)===index;
  })
}

function uniqueByIncludes(arr){
  let retArr=[]
  for(let i=0;i<arr.length;i++){
    if(!retArr.includes(arr[i])){
      retArr.push(arr[i])
    }
  }
  return retArr
}


//开始测试
Promise.all([unique,uniqueBySet,uniqueByMap,uniqueBySort,uniqueByFilter,uniqueByIncludes].map((fn,index)=>{
  return new Promise((resolve,reject)=>{
    console.time('test')
    console.log(`unqiue with method ${fn.name}`)
    fn.call(null, testArr)
    console.timeEnd('test')
    resolve('done')
  })
}))






发布了22 篇原创文章 · 获赞 0 · 访问量 2250

猜你喜欢

转载自blog.csdn.net/weixin_44156518/article/details/88358548