陣列去重的幾個方法

wade3po發表於2019-03-27

陣列去重很簡單,大都運用陣列的屬性和方法,有很簡單的,有複雜的,今天分享幾個陣列去重的方法。

原理就是建立一個臨時陣列,迴圈有重複的陣列,判斷這個臨時陣列是否有這個元素,沒有就push進去,有就不要。

var arr = ['a', 8, 10, 'd', 20, 'f', 'd', 10, 'a'];

var tempArr = [];
複製程式碼

IndexOf,中間陣列要是沒有這個值就push:

for(var i = 0;i < arr.length;i++){ 

 if(tempArr.indexOf(arr[i]) == -1){ 

   tempArr.push(arr[i]);  

 }

}
複製程式碼

Includes,es6方法,也是中間陣列沒有這個值就push:

for(var i = 0;i < arr.length;i++){ 

 if(!tempArr.includes(arr[i])){   

 tempArr.push(arr[i]); 

 }

}
複製程式碼

角標IndexOf,indexOf會返回第一個目標元素的角標,如果當前角標不等於第一個獲得的角標,表示是重複的:

for(var i = 0;i < arr.length;i++){ 

 if(arr.indexOf(arr[i]) == i){  

  tempArr.push(arr[i]); 

 }

}
複製程式碼

先排序再去重,排序完之後,相等的就會相鄰,迴圈排序結果的陣列,跟中間陣列的最後一個比較,如果沒有就push:

var sortArr = arr.sort();

var tempArr = [sortArr[0]];

for(var i = 1; i < sortArr.length; i++){ 

   if(sortArr[i] != tempArr[tempArr.length-1]){  

     tempArr.push(sortArr[i]);  

    }

}
複製程式碼

最相容,迴圈兩個陣列,設定一個標識,要是去重陣列內容在中間陣列裡面找不到就push進去:

for(var i = 0;i < arr.length;i++){ 

 var flag = false;

  for(var j = 0;j < tempArr.length;j++){  

    if(arr[i] == tempArr[j]){  

      flag = true;

break; 

  }; 

 }  

if(!flag){ 

     tempArr.push(arr[i]); 

 };

}
複製程式碼

通過物件屬性不能重複特點,當沒有這個屬性的時候就push進去,切這個物件也要新增這個下標屬性:

var obj = {};

for(var i = 0;i < arr.length;i++){

    if(!obj[arr[i]]){ 

       obj[arr[i]] = true;     

   tempArr.push(arr[i]); 

   }

}

console.log(tempArr);//["a", 8, 10, "d", 20, "f"]

 

ES6set和from:

console.log(Array.from(new Set(arr)));//["a", 8, 10, "d", 20, "f"]
複製程式碼

其實陣列去重的方法原理都是利用中間陣列去比較,不管用includes還是indexOf,原理都是一樣的。還有用其他遍歷函式的方法,比如map、filter等,也能實現,但是原理都一樣。

Coding 個人筆記

陣列去重的幾個方法

相關文章