您的位置:首页 > Web前端 > JavaScript

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

2019-06-11 07:32 1961 查看

这篇文章初衷是想探索去重效率,真的是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')
})
}))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: