手机版

JavaScript高性能阵列重复数据消除方法

时间:2021-08-29 来源:互联网 编辑:宝哥软件园 浏览:

中午和同事一起吃饭,讨论阵列去重的问题

我立即分享了我常用的一种重复数据删除方法,老板立即指出这种方法效率不高

回家后自己测试,发现方法真的很慢

所以这一次,有一个高性能阵列重复数据消除研究

一、测试模板

阵列重复数据消除是一个过时的问题,互联网上流传着各种解决方案

为了测试这些解决方案的性能,我编写了一个测试模板来计算阵列重复数据消除的时间消耗

//distinct . jslet arr 1=Array . from(new Array(100000),(x,index)={ return index})让arr2=Array.from(new Array(50000),(x,Index)={return index index})让start=newdate()。gettime () console.log('开始阵列重复数据消除')函数distinct(a,b) {//阵列重复数据消除}console.log('重复数据消除后的长度',Distinct (arr 1,arr 2)。长度)让end=newdate()。gettime () console.log('耗时',结束-开始)在这里,分别创建了两个长度为10W和5W的数组

然后通过distinct()方法合并两个数组,并删除重复的数组

数据量不大也不小,但已经可以说明一些问题

第二,Array.filter() indexOf

该方法的思想是将两个数组拼接成一个数组,然后使用ES6中的Array.filter()遍历该数组,并组合indexOf以消除重复

函数distinct(a,b){ let arr=a . concat(b);返回逮捕。筛选器((项,索引)={return arr。(item)==index})}这是我比较反感的阵列重复数据删除方法。看起来很简洁,但有实际表现。

是的,现实是如此残酷,处理一个15 W长度的数组需要8427ms。

第三,双供循环

最容易理解的方法是,外部循环遍历元素,内部循环检查它是否重复

当存在重复值时,可以使用push()或splice()

函数distinct(a,b){ let arr=a . concat(b);for(设i=0,len=arr.length伊琳;i ) { for(让j=I ^ 1;jlenj){ if(arr[I]==arr[j]){ arr . splice(j,1);//拼接会改变数组长度,所以将数组长度len和下标j减少一个len-;j-;}}} return arr}但是这种方法占用更多内存,效率最低

第四,对于.的包括()

双for循环的升级版本,外层用for替换for循环.语句,并且内部循环被更改为包括()

首先创建一个空数组,当includes()返回false时,将元素推入空数组

同样,可以使用indexOf()代替includes()

函数distinct(a,b){ let arr=a . concat(b)let result=[]for(let I of arr){!结果法。包括(1)结果。push (I)}返回结果}与filter indexOf非常相似

只需用for循环实现filter()的内部逻辑,然后用includes替换indexOf

因此,持续时间也比较接近

动词(verb的缩写)Array.sort()

首先使用sort()对数组进行排序

然后比较相邻元素是否相等,以消除重复

函数distinct(a,b){ let arr=a . concat(b)arr=arr . sort()let result=[arr[0]]for(let I=1,len=arr.length伊琳;我){ arr[i]!==arr [I-1]结果。push (arr [I])} return result}这个方法只做一个排序和一个循环,所以效率会比上面的方法高

不及物动词新集合()

ES6增加了Set的数据结构,类似于数组,但是Set的成员是唯一的

基于这一特性,它非常适合阵列重复数据消除

函数distinct (a,b) {return array。来自(新集合([.一个,b]))}使用set处理15W数据需要多长时间?

喵喵?57毫秒?我不是眼花了吗?

然后我在两个数组的长度后加了一个0,低于150W W的数据量。

有没有这样一种高性能、简洁的阵列重复数据消除方法?

七,为了.对象的

这种方法我只在一些文章中见过,但在实际工作中不是很有用

首先创建一个空对象,然后用for循环遍历它

使用对象属性不重复的特性检查数组元素是否重复

函数distinct(a,b){ let arr=a . concat(b)let result=[]let obj={ } for(let I of arr){ if(!结果。push (I) obj [I]=1}} return result}看到这个方法的处理时间,我又傻眼了

15W数据才16ms?比Set()快?

然后我尝试了150W W的数据量。

摘要

以上就是边肖介绍的去除JavaScript高性能数组重复项的方法,对大家都有帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!

版权声明:JavaScript高性能阵列重复数据消除方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。