數組去重很簡單,大都運用數組的屬性和方法,有很簡單的,有複雜的,今天分享幾個數組去重的方法。es6
原理就是建立一個臨時數組,循環有重複的數組,判斷這個臨時數組是否有這個元素,沒有就push進去,有就不要。數組
var arr = ['a', 8, 10, 'd', 20, 'f', 'd', 10, 'a'];
var tempArr = [];
複製代碼
IndexOf,中間數組要是沒有這個值就push:bash
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會返回第一個目標元素的角標,若是當前角標不等於第一個得到的角標,表示是重複的:ui
for(var i = 0;i < arr.length;i++){
if(arr.indexOf(arr[i]) == i){
tempArr.push(arr[i]);
}
}
複製代碼
先排序再去重,排序完以後,相等的就會相鄰,循環排序結果的數組,跟中間數組的最後一個比較,若是沒有就push:spa
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進去:code
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進去,切這個對象也要添加這個下標屬性:cdn
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 我的筆記排序