数组去重

数组去重

由于js本身并没有提供数组去重的方法,现自己总结以下几种去重方法

1:indexof()

缺点:不能去掉值相同,类型不同的数据

[1,2,3,4,"1",1] -> [1,2,3,4,"1"]

[1,2,3,4,1] -> [1,2,3,4]

var arr = [1,2,3,1,4];

Array.prototype.unique = function(){
var _arr = [];
for(var i= 0,l=this.length;i<l;i++){
if(_arr.indexOf(this[i]) == -1){
_arr.push(this[i])
}
}
return _arr
};

console.log(arr);//[ 1, 2, 3, 1, 4 ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

2:indexof()

寻找存入参数在数组中第一次出现的位置

缺点:不能去掉值相同,类型不同的数据

[1,2,3,4,"1",1] -> [1,2,3,4,"1"]

[1,2,3,4,1] -> [1,2,3,4]

var arr = [1,2,3,1,4];

Array.prototype.unique = function(){
var _arr = [];
for(var i= 0,l=this.length;i<l;i++){
if(this.indexOf(this[i]) == i){
_arr.push(this[i])
}
}
return _arr
};

console.log(arr);//[ 1, 2, 3, 1, 4 ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

3:采用hash

寻找存入参数在数组中第一次出现的位置

缺点:增加了内存,以空间换时间

[1,2,3,4,"1",1] -> [1,2,3,4]
var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
var _arr = [],obj={};
for(var i= 0,l=this.length;i<l;i++){
if(!obj[this[i]]){
obj[this[i]] = true;
_arr.push(this[i])
}
}
return _arr
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

4:sort()

寻找存入参数在数组中第一次出现的位置

缺点:不能去掉值相同,类型不同的数据

[1,2,3,4,"1",1] -> [1,2,3,4,"1"]

[1,2,3,4,1] -> [1,2,3,4]

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
this.sort();
var _arr = [this[0]];
for(var i= 0,l=this.length;i<l;i++){
if(_arr[_arr.length-1] !== this[i]){
_arr.push(this[i])
}
}
return _arr
};

console.log(arr);//[1,2,3,1,4,"1"]
console.log(arr.unique());//[1,2,3,4,"1"]

5:sort()

缺点:不能去掉值相同,类型不同的数据

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
var self = this;
var _arr = this.concat().sort();
_arr.sort(function(a,b){
if(a == b){
self.splice(self.indexOf(a),1)
}
});
return self
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 2, 3, 4, '1' ]

6:reduce()

能去掉值相同,类型不同的数据

[ 1, 2, 3, 1, 4, '1' ] -> [ 1, 2, 3, 4, '1' ]

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
return this.reduce(function(a,b){
if(a.indexOf(b) == -1 ){
a.push(b);
}
return a;
},[]);
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 1, 2, 3, 4, '1' ]

7:把A数组循环赋值到B数组

var arr = [1,2,3,1,4,"1"];

Array.prototype.unique = function(){
var result = [];
var isRepeat ;
for(var i=0;i<this.length;i++){
isRepeat = false;
for(var j=0;j<result.length;j++){
if(this[i] == result[j]){
isRepeat = true;
break;
}
}
if(!isRepeat){
result.push(this[i])
}
}
return result;
};

console.log(arr);//[ 1, 2, 3, 1, 4, '1' ]
console.log(arr.unique());//[ 1, 2, 3, 4 ]

以下是一个测试上述7中方法的效率





数组去重判断


结果输出:

method1使用时间565ms
method2使用时间741ms
method3使用时间25ms
method4使用时间57ms
method5使用时间28ms
method6使用时间526ms
method7使用时间434ms
10000
6331
6331
6331
6331
10000
6331
6331

posted on 2016-05-31 20:24  借个火点烟  阅读(204)  评论(0)    收藏  举报