ES5 ES6中Array對(duì)象去除重復(fù)項(xiàng)的方法總結(jié)
輸入例子
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq()
輸出例子
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
分析
題目要求給 Array 添加方法,所以我們需要用到 prototype。數(shù)組去重本身算法不是很難,但是在 JavaScript 中很多人會(huì)忽視 NaN 的存在,因?yàn)樵?JS 中 NaN !== NaN 。但是在去重中我們又不能保留兩個(gè) NaN ,所以需要進(jìn)行一下判斷,這是很多人容易忽視的。
ES5的實(shí)現(xiàn)如下:
代碼
Array.prototype.uniq = function () { var arr = []; var flag = true; this.forEach(function(item) { // 排除 NaN (重要?。?!) if (item != item) { flag && arr.indexOf(item) === -1 ? arr.push(item) : ''; flag = false; } else { arr.indexOf(item) === -1 ? arr.push(item) : '' } }); return arr; }
驗(yàn)證
我們只需要在數(shù)組上直接調(diào)用 uniq 方法就可以了,如:
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq()
結(jié)果為:
[false, true, undefined, null, NaN, 0, 1, {}, {}, 'a']
進(jìn)階
ES6的實(shí)現(xiàn)
ES6新增了 Set 對(duì)象,也就是我們所說的“集合”,它類似于數(shù)組,但是成員的值都是唯一的,沒有重復(fù)的值。所以可以方便去重。
Set本身是一個(gè)構(gòu)造函數(shù),用來生成Set數(shù)據(jù)結(jié)構(gòu)。(詳看👉Set和Map數(shù)據(jù)結(jié)構(gòu))
如果用ES6為 Array 對(duì)象添加一個(gè)去除重復(fù)項(xiàng)的方法,則可以如下實(shí)現(xiàn):
Array.prototype.uniq = function() { return Array.from(new Set(this)); }
代碼中用 Array.from 把 Set 結(jié)構(gòu)轉(zhuǎn)換成數(shù)組,當(dāng)然,你也可以用其他方法,這里不深究。這里去重關(guān)鍵代碼只需要一行,是不是非常簡單?😄
如果你要優(yōu)雅一點(diǎn),可以使用 ES6 的擴(kuò)展運(yùn)算符。如下:
Array.prototype.uniq = function() { return [...new Set(this)]; }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 詳解JavaScript ES6中的模板字符串
- 淺談ES6 模板字符串的具體使用方法
- ES6新特征數(shù)字、數(shù)組、字符串
- ES6新特性之變量和字符串用法示例
- JavaScript中ES6字符串?dāng)U展方法
- JavaScript學(xué)習(xí)筆記之ES6數(shù)組方法
- ES6使用Set數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)數(shù)組的交集、并集、差集功能示例
- ES6新特性七:數(shù)組的擴(kuò)充詳解
- 淺談ES6新增的數(shù)組方法和對(duì)象
- ES6中箭頭函數(shù)的定義與調(diào)用方式詳解
- ES6學(xué)習(xí)筆記之字符串、數(shù)組、對(duì)象、函數(shù)新增知識(shí)點(diǎn)實(shí)例分析
相關(guān)文章
關(guān)于js new Date() 出現(xiàn)NaN 的分析
在一個(gè)項(xiàng)目中需要進(jìn)行日期的格式化,后臺(tái)傳到前端是時(shí)間的整數(shù)(Date.getTime),當(dāng)后臺(tái)數(shù)據(jù)返回字符串時(shí),發(fā)現(xiàn)轉(zhuǎn)換日期時(shí)在ie下變成NaN,但是真的是這樣嗎?接下來我們慢慢分析2012-10-10javascript密碼強(qiáng)度校驗(yàn)代碼(兩種方法)
為了保證網(wǎng)站個(gè)人信息的安全,很多網(wǎng)站在注冊(cè)頁面都設(shè)置密碼強(qiáng)度這項(xiàng),用javascript如何實(shí)現(xiàn)密碼強(qiáng)度校驗(yàn)代碼呢?下面小編給大家整理了兩種方法使用javascript密碼強(qiáng)度校驗(yàn)代碼,有需要的朋友可以參考下2015-08-08Extjs 點(diǎn)擊復(fù)選框在表格中增加相關(guān)信息行
這篇文章主要介紹了Extjs 點(diǎn)擊復(fù)選框在表格中增加相關(guān)信息行 的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07使用javascript實(shí)現(xiàn)判斷當(dāng)前瀏覽器
這篇文章主要介紹了使用javascript實(shí)現(xiàn)判斷當(dāng)前瀏覽器的類型及版本,雖然不是很全面,但是還是推薦給大家,簡單學(xué)下方法和思路。2015-04-04200行代碼實(shí)現(xiàn)blockchain 區(qū)塊鏈實(shí)例詳解
這篇文章主要介紹了200行代碼實(shí)現(xiàn)blockchain 區(qū)塊鏈的相關(guān)知識(shí),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-03-03JavaScript+Canvas實(shí)現(xiàn)簡單的柱狀圖
這篇文章主要為大家詳細(xì)介紹了JavaScript如何利用Canvas實(shí)現(xiàn)繪制簡單的柱狀圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10JavaScript實(shí)現(xiàn)樓梯滾動(dòng)特效(jQuery實(shí)現(xiàn))
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)樓梯滾動(dòng)特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09微信小程序?qū)崿F(xiàn)短信驗(yàn)證碼倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)短信驗(yàn)證碼倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05