總結下javascript中常見的數組去重方法,面試中也常常會遇到這個問題。引伸的還有合併數組並去重。javascript
思路:新建一數組,遍歷傳入數組,若元素不在新數組中就添加到新數組中。java
注意:判斷值是否在數組的方法「indexOf」是ECMAScript5方法,IE8如下不支持,需多寫兼容低版本瀏覽器代碼。 面試
1 //判斷瀏覽器是否支持indexOf方法 2 if(!Array.prototype.indexOf){ 3 //新增indexOf方法 4 Array.prototype.indexOf = function(item){ 5 var result = -1, 6 arr_item = null; 7 if(this.length == 0) { 8 return result; 9 } 10 for(var i=0,len=this.length; i<len; i++){ 11 arr_item = this[i]; 12 if(arr_item === item){ 13 result = i; 14 break; 15 } 16 } 17 return result; 18 }; 19 } 20
1 function unique1(arr){ 2 var newArr = [];//新建一個數組 3 for(var i=0,len=arr.length;i<len;i++){ 4 if(newArr.indexOf(arr[i]) == -1){//若新數組中未包含該項則將其存入新數組 5 newArr.push(arr[i]); 6 } 7 } 8 return newArr; 9 }
思路:若是當前數組的第i項在當前數組中第一次出現的位置不是i,那麼表示第i項是重複的,忽略掉。不然存入結果數組。數組
注意:此方法也用到了「indexOf」方法。瀏覽器
1 function unique2(arr){ 2 var newArr = []; 3 for(var i=0, len=arr.length; i<len; i++){ 4 if(arr.indexOf(arr[i]) == i){ 5 newArr.push(arr[i]); 6 } 7 } 8 return newArr; 9 }
思路:將傳入的數組進行排序,相同的元素就會相鄰。再遍歷數組,將元素與新數組的最後一個值進行比較,若不一樣則加入新數組。app
1 function unique3(arr){ 2 arr.sort(); 3 var newArr = [arr[0]]; 4 for(var i=1, len=arr.length; i<len; i++){ 5 if(arr[i] !== newArr[newArr.length-1]){ 6 newArr.push(arr[i]); 7 } 8 } 9 return newArr; 10 }
思路:遍歷傳入的數組,元素與右邊的元素依次比較,若元素有重複,則結束當前的元素比較,將下一個元素當作比較對象,即跳出內層循環。優化
1 function unique4(arr){ 2 var newArr = []; 3 for(var i=0,len=arr.length; i<len;i++){ 4 for(var j=i+1;j<len;j++){ 5 if(arr[i] === arr[j]){//獲取沒重複的最右一值放入新數組 6 ++i; 7 } 8 } 9 newArr.push(arr[i]); 10 } 11 return newArr; 12 }
思路:concat() 方法將傳入的數組或非數組值與原數組合並,組成一個新的數組並返回。該方法會產生一個新的數組。this
function concatArr(arr1, arr2){ var arr = arr1.concat(arr2); arr = unique1(arr);//再引用上面的任意一個去重方法 return arr; }
思路:該方法優勢是不會產生一個新的數組。spa
1 var a = [1, 2, 3]; 2 var b = [4, 5, 6]; 3 4 Array.prototype.push.apply(a, b);//a=[1,2,3,4,5,6] 5 //等效於:a.push.apply(a, b); 6 //也等效於[].push.apply(a, b);
1 function concatArray(arr1,arr2){ 2 Array.prototype.push.apply(arr1, arr2); 3 arr1 = unique1(arr1); 4 return arr1; 5 }