Javascript數組去重的幾種方法詳解

數組去重

1 雙層for循環(類似冒泡排序的雙層循環寫法)

var arr = [2,3,4,2,34,21,1,12,3,4,1]
for(var i =0;i<arr.length;i++){
    //第一層:每次循環拿到arr中一個元素
	for(var j=i+1;j<arr.length;j++){
        //第二層:每次拿到的元素再和每次拿到的元素後邊的元素依次進行比對(因為第一個要從第二個開始比,第二個要從第三個比以此類推,所以這裡的j應比i大1為j=i+1)
    	if(arr[i] === arr[j]){
            //如果相同就刪除後邊的元素
        	arr.splice(j,1)
    	}
    }
}
//arr:[1, 2, 3, 4, 12, 21, 34]

2 循環和indexof、循環和includes

創建新數組,循環舊數組,看每次循環的元素是否存在於新數組中沒有就把當前元素添加到新數組中

//indexof
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = []
arr.forEach((e)=>{
    if(arr2.indexOf(e)==-1){
        arr2.push(e)
    }
})
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]
//includes
var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = []
arr.forEach((e)=>{
    if(!arr2.includes(e)){
        arr2.push(e)
    }
})
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]

3 利用對象屬性不能重復去重

var arr = [2,3,4,2,34,21,1,12,3,4,1]
var obj = {};
arr.forEach((e,i)=>{
    obj[arr[i]] = "abc";   
});
var arr2=Object.keys(obj)
console.log(arr2)
//arr2:["1", "2", "3", "4", "12", "21", "34"]
var arr3 = arr2.map(e => ~~e )
//arr3:[1, 2, 3, 4, 12, 21, 34]
//註意這種方法不僅給數組重新排列而且還改變瞭數組中元素的類型

~是js裡的按位取反操作符,~~就是執行兩次按位取反,其實就是保持原值,但是註意雖然是原值,但是對佈爾型變量執行這個操作,會轉化成相應的數值型變量,也就是 ~~true === 1,~~false === 0。

4 ES6 Set

ES6 提供瞭新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重復的值。

var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr1 = [...new Set(arr)]
console.log(arr1)
//arr1:[1, 2, 3, 4, 12, 21, 34]

5 ES6 Array. prototype.filter()

註:indexOf在數組中找元素的時候,碰到符合條件的第一個就會把它的下標返回

var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = arr.filter((e,i)=>{
    //看每次循環的元素在數組中出現的第一個下標位置(indexOf返回的位置),和每次循環的元素的下標(filter循環每次的i)是否一致,一致就說明他就是第一個符合條件,不會被過濾掉。
    return arr.indexOf(e)==i;
})
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]

6 ES6 Array. prototype.reduce()

var arr = [2,3,4,2,34,21,1,12,3,4,1]
var arr2 = arr.reduce((pre,e)=>{
    //這裡當然也可以用indexOf來判斷是否存在
    pre.includes(e)?pre:pre.push(e);
    return pre
},[])
console.log(arr2)
//arr2:[1, 2, 3, 4, 12, 21, 34]

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!

推薦閱讀: