前言
在做javascript開發的時候,經常會遇到數組元素重復的問題,而javascript Array又沒有直接提供方法解決此問題,還需要自己去實現。這篇文章總結了Javascript中數組各種去重的方法,下面來一起看看。
方法一 利用對象屬性不重復的特性
Array.prototype.distinct = function (){
var arr = this,
i,
obj = {},
result = [],
len = arr.length;
for(i = 0; i< arr.length; i++){
if(!obj[arr[i]]){ //如果能查找到,證明數組元素重復了
obj[arr[i]] = 1;
result.push(arr[i]);
}
}
return result;
};
方法二 雙層循環,外層循環元素,內層循環時比較值
Array.prototype.distinct = function(){
var arr = this,
result = [],
i,
j,
len = arr.length;
for(i = 0; i < len; i++){
for(j = i + 1; j < len; j++){
if(arr[i] === arr[j]){
j = ++i;
}
}
result.push(arr[i]);
}
return result;
}
方法三 數組遞歸去重
Array.prototype.distinct = function (){
var arr = this,
len = arr.length;
arr.sort(function(a,b){ //對數組進行排序才能方便比較
return a - b;
})
function loop(index){
if(index >= 1){
if(arr[index] === arr[index-1]){
arr.splice(index,1);
}
loop(index - 1); //遞歸loop函數進行去重
}
}
loop(len-1);
return arr;
};
方法四 利用indexOf以及forEach
Array.prototype.distinct = function (){
var arr = this,
result = [],
len = arr.length;
arr.forEach(function(v, i ,arr){ //這裡利用map,filter方法也可以實現
var bool = arr.indexOf(v,i+1); //從傳入參數的下一個索引值開始尋找是否存在重復
if(bool === -1){
result.push(v);
}
})
return result;
};
方法五 利用ES6的set
function dedupe(array){
return Array.from(new Set(array));
}
dedupe([1,1,2,3]) //[1,2,3]
方法六 拓展運算符(…)內部使用for…of循環
let arr = [3,5,2,2,5,5]; let unique = [...new Set(arr)]; //[3,5,2]
總結
好了,以上就是這篇文章的全部內容了,個人比較喜歡使用方法一,不會對原數組進行修改,希望這篇文章對大家能有所幫助,如果有疑問大家可以留言交流。