JavaScript數組去重—ES6的兩種方式

說明

JavaScript數組去重這個問題,常常出如今面試題中,之前也寫過一篇數組去重的文章,(JavaScript 數組去重的多種方法原理詳解)但感受代碼仍是有點不夠簡單,今天和你們再說兩種方法,代碼但是足夠的少了。javascript

解釋

方法一:

function unique(arr) { const res = new Map(); return arr.filter((a) => !res.has(a) && res.set(a, 1)) }

就這麼短,就能夠了,咱們來解釋一下爲何。css

Map對象html

Map是ES6 提供的新的數據結構。 
Map 對象保存鍵值對。任何值(對象或者原始值) 均可以做爲一個鍵或一個值。java

下表列出了 Map 對象的方法。 
es6

Map對象還有一個size屬性,他返回Map對象的鍵/值對的數量。面試

數組的 filter() 方法數組

filter() 方法建立一個新的數組,新數組中的元素 是 經過檢查 指定數組 中 符合條件的全部元素。數據結構

語法:函數

array.filter(function(currentValue,index,arr), thisValue)

參數說明: 
ui

箭頭函數

return arr.filter((a) => !res.has(a) && res.set(a, 1)) //上面的代碼能夠改爲這樣 return arr.filter(function(a){ return !res.has(a) && res.set(a, 1); });

一、箭頭函數寫代碼擁有更加簡潔的語法;
二、不會綁定this。

瞭解更多,點這裏

方法一 分析

function unique(arr) { //定義常量 res,值爲一個Map對象實例 const res = new Map(); //返回arr數組過濾後的結果,結果爲一個數組 //過濾條件是,若是res中沒有某個鍵,就設置這個鍵的值爲1 return arr.filter((a) => !res.has(a) && res.set(a, 1)) }

方法二:

function unique(arr) { return Array.from(new Set(arr)) }

這個方法的代碼量更少,簡直難以想象。 
數組的 from方法

Array.from() 方法從一個相似數組或可迭代的對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等) 中建立一個新的數組實例

語法:

Array.from(arrayLike[, mapFn[, thisArg]])

示例代碼:

const bar = ["a", "b", "c"]; Array.from(bar); // ["a", "b", "c"] Array.from('foo'); // ["f", "o", "o"]

Set對象

Set 對象容許你存儲任何類型的 惟一值 ,不管是原始值或者是對象引用。 
Set對象是值的集合,你能夠按照插入的順序迭代它的元素。
Set中的元素只會出現一次,即 Set 中的元素是惟一的。

語法:

new Set([iterable]);

參數: 
iterable,若是傳遞一個可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等),它的全部元素將被添加到新的 Set中。若是不指定此參數或其值爲null,則新的 Set爲空。

下表列出了 Set 對象的方法。 

Set對象和Map對象同樣,都有一個size屬性,他返回Set對象的值的個數。

方法二 分析

function unique(arr) { //經過Set對象,對數組去重,結果又返回一個Set對象 //經過from方法,將Set對象轉爲數組 return Array.from(new Set(arr)) }

總結

此次說的兩個方法,真的很簡單,主要就是靠ES6裏的新東西,難度不大,代碼簡單,主要就是多用用就行了。


經人提醒,再補充一種,[...new Set(arr)] 
圖片描述
不懂 ... 的朋友,能夠看這裏 js擴展運算符

參考

ES6新特性:Javascript中的Map和WeakMap對象 
http://www.cnblogs.com/dilige... 
Set和Map數據結構 
http://es6.ruanyifeng.com/#do... 
MDN 
https://developer.mozilla.org... 
Array filter() 
http://www.runoob.com/jsref/j... 
Array.from() 
https://developer.mozilla.org... 
JavaScript初學者必看「箭頭函數」 
http://www.cnblogs.com/fundeb...

相關文章
相關標籤/搜索