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

js 数组去重复项的五种方法比较

2016-05-27 10:59 537 查看
第一种:耗时最长,用了双重循环

Array.prototype.unique1 = function () {
var r = new Array();
label:for(var i = 0, n = this.length; i < n; i++) {
for(var x = 0, y = r.length; x < y; x++) {
if(r[x] == this[i]) {
continue label;
}
}
r[r.length] = this[i];
}
return r;
}


第二种:用了正则表达式

Array.prototype.unique2 = function () {
return this.sort().join(",,").replace(/(,|^)([^,]+)(,,\2)+(,|$)/g,"$1$2$4").replace(/,,+/g,",").replace(/,$/,"").split(",");
}


第三种:用了hasOwnProperty

Array.prototype.unique3 = function() {
var temp = {}, len = this.length;
for(var i=0; i < len; i++)  {
var tmp = this[i];
if(!temp.hasOwnProperty(tmp)) {
temp[this[i]] = "my god";
}
}

len = 0;
var tempArr=[];
for(var i in temp) {
tempArr[len++] = i;
}
return tempArr;
}


第四种:先排序,再比较相邻的

Array.prototype.unique4 = function () {
var temp = new Array();
this.sort();
for(i = 0; i < this.length; i++) {
if( this[i] == this[i+1]) {
continue;
}
temp[temp.length]=this[i];
}
return temp;

}


第五种:用了hash,耗时最短

Array.prototype.unique5 = function() {
var result=[], hash={};
for(var i=0;i<this.length;i++){
if(!hash[this[i]]){
result.push(this[i]);
hash[this[i]]=true;
}
}
return result;
}


测试方法:

function testArr(){
var arr=[];
for(var i=0;i<100000;i++){
arr.push(i);
}
var d1=new Date().getTime();
arr.unique1();
console.log("unique1:执行了 "+(new Date().getTime()-d1)+" ms");
//unique1:执行了 4516 ms
d1=new Date().getTime();
arr.unique2();
console.log("unique2:执行了 "+(new Date().getTime()-d1)+" ms");
//unique2:执行了 153 ms
d1=new Date().getTime();
arr.unique3();
console.log("unique3:执行了 "+(new Date().getTime()-d1)+" ms");
//unique3:执行了 60 ms
d1=new Date().getTime();
arr.unique4();
console.log("unique4:执行了 "+(new Date().getTime()-d1)+" ms");
//unique4:执行了 95 ms
d1=new Date().getTime();
arr.unique5();
console.log("unique5:执行了 "+(new Date().getTime()-d1)+" ms");
//unique5:执行了 16 ms
}
testArr();


借鉴于:js数组去重复项
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: