關於陣列去重

2021-08-28 03:56:38 字數 3613 閱讀 9957

首先先來一種簡單粗暴的方法 

也是很容易就可以想到的辦法 

宣告乙個新陣列 

直接遍歷這個待去重陣列 

然後把新陣列中沒有的元素推進去

function unique(arr)

} return newarr;

};

測試陣列

var arr = [1,3,2,1,4,5,2,4,1,5];

console.log(unique(arr)); //[1,3,2,4,5]

這個結果是正確的 

但是如果元素中有undefined或者null就會出現問題

var arr = [1,3,2,1,null,4,5,2,4,1,5,null];

console.log(unique(arr)); //[1,3,2]

這是因為for(var i = 0, item; item = arr[i++];)

null導致提前跳出了循壞 

沒辦法雖然我很喜歡這種迴圈方式 

但是為了保持嚴謹還是要使用正常的for迴圈

function unique(arr)

} return newarr;

};var arr = [1,3,2,1,null,4,5,2,4,1,5,null];

console.log(unique(arr)); //[1,3,2,null,4,5]

當然也可以使用es5的foreach方法 

雖然它沒有for迴圈的效率高

function unique(arr)

});return newarr;

}

下面的其他方法也可以把for迴圈替換成foreach

除此之外,我們還可以使用es5的reduce方法 

讓**看起來更加高大上

function unique(arr)

return prev;

}, );

}

indexof也可以替換成迴圈判斷 

不過既然有好使的api就直接拿來用了 

順便一提,方法不能夠處理陣列nan的去重

var arr = [4, 2, 1, 3, 2, 3, nan, nan];

console.log(unique(arr)); //[4,2,1,3,nan,nan]

包括下面的方法都不可以 

不過可以把indexof()換成es6的array.contains() 

真正意義上的絕對相等 

這裡我就不討論太複雜的情況了

這種方法是利用了陣列indexof的特點 

它會找到陣列中第乙個該元素值的索引 

所以我們可以判斷陣列元素的indexof索引判斷和元素本身的索引是否相同 

如果相同,代表這是陣列第一次出現的該元素值

function unique(arr)

} return newarr;

}

我們還可以做一些小小的優化 

因為實際上第一次是不需要判斷的 

陣列元素的第乙個值一定是首次出現的 

所以從陣列的第二個元素開始迴圈就可以了

function unique(arr)

} return newarr;

}

這種方法的原理就是首先呼叫陣列的sort方法 

我們的目的不是給陣列元素排序 

所以也不需要為sort新增處理函式 

目的是為了把相同的元素值聚在一起 

這樣只需要判斷陣列元素值和上乙個索引值不同就可以了

function unique(arr)

} return newarr;

}

這種方法看起來特別夢幻 

原理是不斷的將陣列最右邊不重複的值推入新陣列

function unique(arr)

}newarr.push(arr[i]);

} return newarr;

};

說的再詳細一下 

就是對陣列的每乙個元素都進行判斷(指標i) 

還有另乙個指標從判斷元素的下一位進行判斷 

移動這個指標(指標j下移) 

如果發現判斷元素與指標指向的值相等 

證明該判斷元素不是陣列中唯一的 

那麼就繼續往下判斷(指標i下移,指標j回到i的下一位) 

直到j移到陣列終點 

證明判斷元素(指標i指向的元素)是陣列中唯一的 

推入新陣列

這種方法是很好的一種方法 

借用了乙個臨時物件的資料結構 

這個物件用來儲存陣列的元素

function unique(arr);

var item;

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

} return newarr;

}

這是典型的空間換取時間思想的演算法 

如果陣列很大可能會很佔記憶體 

但是效率很高這是毋庸置疑的 

其實現在這個函式還是有缺點

var arr = [1,3,2,1,4,5,2,4,1,5,'1','2'];

console.log(unique(arr)); //[1,3,2,4,5]

從這個測試中可以看到陣列和字元沒能有效區分 

這是因為它們傳入物件中會呼叫tostring() 

物件的鍵都是字串 

既然這樣我們可以對函式做一些修改 

讓物件的鍵對應乙個陣列 

陣列儲存著已有的型別

function unique(arr);

var item;

var type;

for(var i = 0, len = arr.length; i < len; i++)else if(temp[item].indexof(type) === -1)

} return newarr;

}

這樣記憶體占用更大了 

但是卻更加嚴謹了

var arr = [1,3,2,1,4,5,2,4,1,5,'1','2'];

console.log(unique(arr)); //[1,3,2,4,5,"1","2"]

集合這個資料結構最大的特點就是 

集合內部的元素都是唯一的 

es6標準給我們提供了set集合 

利用這個新的資料結構我們可以很容易的實現陣列去重 

容易到什麼程度呢? 

一行.. 

就夠了

function unique(arr)
這才是真正的簡單粗暴 

將陣列轉為集合,拋棄多餘數值 

最後利用es6的新陣列方法array.from將集合轉為陣列返回

function unique(arr)

關於陣列的去重

簡單一維陣列的去重方法有很多,這種陣列裡面的值都是普通的資料型別,並沒有物件,因此去重方法有很多,這裡總結一下常用的四種方法 網上還有一些其它的方法 方法一 雙層迴圈去重 function uniquearr arr result.push arr i return result 方法二 利用物件的...

JS陣列去重,物件去重

例項1根據indexof去重,indexof的好處就是返回的是首次出現的位置,這樣後面即使出現的值一樣,也只能返回第一次出現的索引,當然這個只適用於簡單的陣列 物件陣列去重 const objarr const obj const newobjarr for let i 0 i objarr.len...

關於陣列的那些事 陣列去重

陣列去重的方法很多,我在這裡整理了其中一種方法,並且就著例子介紹了下其中的思路。1.陣列去重的js 如下 var arr1 5,16,4,1,5,14,16 var arr2 for var i 0 i console.log arr2 2.關於陣列去重,我使用的是js的indexof 這個方法 i...