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') }) }))
相关文章推荐
- JS中集合对象(Array、Map、Set)及类数组对象的使用与对比
- js中数据结构数组Array、映射Map、集合Set、对象、JSON
- js通过map和set判断数组中的对象的某个属性是否有重复
- 目前自己能写出的效率最高的取两个数组中的相同元素
- list,set,map,数组间的相互转换
- ES6---扩展运算符和rest‘...’(三点运算符),在数组、函数、set/map等中的应用
- 【Scala篇】--Scala中集合数组,list,set,map,元祖
- 《Java编程思想》之对象的集合(数组、List、Set、Map)二
- list,set,map,数组间的相互转换
- 判断List、Map、Set是否为空及效率比较
- JSTL遍历数组,List,Set,Map等
- js数组的迭代器方法(some、every、forEach、map、filter)
- list,set,map,数组间的相互转换
- Java 集合转换(数组、List、Set、Map相互转换)
- 模拟js数组方法map()
- Java开发中如何选择Set、List、Map、数组
- JAVA 集合List,数组,Set,Map,直接的相互转换
- List,数组,map,set 相互转化
- list,set,map,数组间的相互转换
- [从codewars学习到的JS系列1]数组方法reduce(),map(),正则$1等的使用