因爲js自己並無提供數組去重的方法,現本身總結如下幾種去重方法html
缺點:不能去掉值相同,類型不一樣的數據數組
[1,2,3,4,"1",1] -> [1,2,3,4,"1"]dom
[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 ]
尋找存入參數在數組中第一次出現的位置this
缺點:不能去掉值相同,類型不一樣的數據prototype
[1,2,3,4,"1",1] -> [1,2,3,4,"1"]code
[1,2,3,4,1] -> [1,2,3,4]htm
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 ]
尋找存入參數在數組中第一次出現的位置ip
缺點:增長了內存,以空間換時間內存
[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 ]
尋找存入參數在數組中第一次出現的位置
缺點:不能去掉值相同,類型不一樣的數據
[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"]
缺點:不能去掉值相同,類型不一樣的數據
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' ]
能去掉值相同,類型不一樣的數據
[ 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' ]
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