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')
  })
}))






  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值