数组去重
数组去重
由于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中方法的效率
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>数组去重判断</title>
</head>
<body >
<div id="out"></div>
<script>
document.write = function(s){
document.getElementById("out").innerHTML += s
};
Array.prototype.unique1 = 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;
};
Array.prototype.unique2 = 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;
};
Array.prototype.unique3 = 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
};
Array.prototype.unique4 = 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
};
Array.prototype.unique5 = 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
};
Array.prototype.unique6 = function(){
return this.reduce(function(a,b){
if(a.indexOf(b) == -1 ){
a.push(b);
}
return a;
},[]);
};
Array.prototype.unique7 = 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;
};
function test(){
var testArr = [];
for(var i=0;i<10000;i++){
testArr.push("a"+Math.round(Math.random(i)*10000))
}
var test1 = doTest(testArr,1);
var test2 = doTest(testArr,2);
var test3 = doTest(testArr,3);
var test4 = doTest(testArr,4);
var test5 = doTest(testArr,5);
var test6 = doTest(testArr,6);
var test7 = doTest(testArr,7);
document.write(testArr.length+'<br>');
document.write(test1.length+'<br>');
document.write(test2.length+'<br>');
document.write(test3.length+'<br>');
document.write(test4.length+'<br>');
document.write(test5.length+'<br>');
document.write(test6.length+'<br>');
document.write(test7.length+'<br>');
}
function doTest(arr,n){
var startTime = (new Date()).getTime();
var re = [];
switch (n){
case 1:
re = arr.unique1();
break;
case 2:
re = arr.unique2();
break;
case 3:
re = arr.unique3();
break;
case 4:
re = arr.unique4();
break;
case 5:
re = arr.unique5();
break;
case 6:
re = arr.unique6();
break;
case 7:
re = arr.unique7();
break;
}
var endTime = (new Date()).getTime();
document.write("method"+n+"使用时间"+(endTime-startTime)+"ms<br/>");
return re;
}
test();
</script>
</body>
</html>
结果输出:
method1使用时间565ms
method2使用时间741ms
method3使用时间25ms
method4使用时间57ms
method5使用时间28ms
method6使用时间526ms
method7使用时间434ms
10000
6331
6331
6331
6331
10000
6331
6331