手机版

javascript阵列重复数据消除三种方法的性能测试和比较

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

昨天,在一次前端采访中,其中一个问题是数组复制。第一个想法是存储对象键值的方法。代码如下:方法1:(简单存储键值)复制代码如下: array . prototype . distinct 1=function(){ var I=0,tmp={},that=this。对此进行切片(0)。长度=。for(;长度;i ){ if(!(tmp中的[I]){ this[this . length]=that[I];tmp[那[我]]=真;} }返回此;};上面的方法并不复杂,思路也简单,但是遇到不同的类型,可以转换成同一个字符串,比如1和‘1’,就完成了;所以采用传统的双循环,代码如下:方法二:(双循环)复制代码如下: array . prototype . distinct 2=function(){ var I=0,flag,即=this . slice(0);this . length=0;for(;长度;I){ var tmp=那个[I];flag=truefor(var j=0;JT this . length;j){ if(this[j]===tmp){ flag=false;break } } if(flag)this[this . length]=tmp;}退回这个;};上述方法得到了预期的结果,但两层循环的效率相对较低。我们先从第一个方法开始尝试Kamijozu,然后添加字符串保存的数组项的类型。如果有新类型,连接字符串并添加它。当我们找到一个已保存的类型时,我们将用null替换已保存类型的字符串。代码方法3:(保存键值和类型)复制代码如下: array . prototype . distinct 4=function(){ var I=0,tmp={},T2,that=this.slice (0),一;this . length=0;for(;长度;I){ one=那个[I];t2=类型一;if(!(tmp中的一个){ this[this . length]=1;tmp[one]=T2;}else if(tmp[one]。indexOf(T2)==-1){ this[this . length]=1;tmp[one]=T2;} }返回此;};为了区分不同数据的各种算法的效率差距,举几个极端的例子来验证。首先看一下从1到80的所有数组项都不一样,循环1000次的情况。嗯,IE6弱爆IE 9:

chrome :

火狐:

国际电工委员会6:

以下是80项全部重复1000次的情况。结合以上数据发现,除了IE6-8之外的所有浏览器双循环表现都不错,而IE6-8双循环则慢了10-20倍左右,这是一个可悲的提醒。如果你的网站只支持IE9或以上,可以放心使用双环法;否则应使用健康值法,根据数据情况选择使用方法1或方法3(图中方法4只发现更改地图已经来不及了,但原方法3使用了indexOf Array,因速度慢且不兼容未发布)IE9:

铬:

火狐:

IE6:

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