Javascript 更新 JavaScript 数组的 uniq 方法
Javascript 更新 JavaScript 数组的 uniq 方法
发布时间:2016-12-30 来源:查字典编辑
摘要:上次写的一篇《JavaScript数组的uniq方法》,发现代码的问题还是存在。比如如果数组内有undefined元素就无法过滤等。昨天看见...

上次写的一篇《JavaScript数组的uniq方法》,发现代码的问题还是存在。比如如果数组内有undefined元素就无法过滤等。

昨天看见Lazy兄弟重新更新了函数,现在他是这样子写的:

Array.prototype.uniq=function(){

varresultArr=[],

returnArr=[],

origLen=this.length,

resultLen;

functioninclude(arr,value){

for(vari=0,n=arr.length;i<n;++i){

if(arr[i]===value){

returntrue;

}

}

returnfalse;

}

resultArr.push(this[0]);

for(vari=1;i<origLen;++i){

if(include(resultArr,this[i])){

returnArr.push(this[i]);

}else{

resultArr.push(this[i]);

}

}

resultLen=resultArr.length;

this.length=resultLen;

for(vari=0;i<resultLen;++i){

this[i]=resultArr[i];

}

returnreturnArr;

}按照他的说法:“这种解法在整个过程对原有数组的改变只有两次,效率比其他两种高了2个数量级左右!”,我实测了下此函数的效率,的确如此(测试连接点这里)。

我也重新编写和更新了我的函数,现在看起来是这个样子的:

Array.prototype.uniq=function(){

vartmp=newArray;

varlength=this.length;

for(vari=0;i<length;i++){

varpush=true;

for(varj=i+1;j<length;j++){

if(this[j]===this[i]){

push=false;

break;

}

}

if(push){

tmp.push(this[i])

}

}

this.length=tmp.length;

for(vari=0;i<tmp.length;i++){

this[i]=tmp[i];

}

returntmp;

}由同一个页面测试所得,效率还是Lazy兄弟的稍许快些。经过一点思考以后,我有了些一点点我的心得:

我的函数for嵌套可以用一个函数独立(就如Lazy兄弟的include函数一样)。在上述的情况下,调用函数会比循环判断效率要高一些。

数组的循环读写操作在数据量大的情况下应格外的注意效率问题

Lazy兄弟的结论:

对数组的改变开销巨大,如果可能,尽量在不改变原有数组的情况下进行操作。

如最终需要改变数组自身,可将结果赋予原有数组来操作。另外,对于length

的计算,似乎效率并未受其影响。Lazy兄弟的resultArr数组按照他这样的写法就可以保存同样的值,在这里赞一个(虽然我的函数经过一点小的修改也可以实现)。感兴趣的朋友可以去Lazy的页面去看看。

最后,推荐阅读一下王元涛兄弟的JavaScript数组的uniq方法,万分感谢。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新Javascript教程学习
热门Javascript教程学习
编程开发子分类