JavaScript數(shù)組去重常見(jiàn)四種方法(最新整理)
JavaScript數(shù)組去重的四種方法解析
數(shù)組去重是JavaScript開(kāi)發(fā)中常見(jiàn)的需求,本文將詳細(xì)解析四種常用的數(shù)組去重方法及其優(yōu)缺點(diǎn)。
方法1: 使用Set數(shù)據(jù)結(jié)構(gòu)
function deduplicateWithSet(arr) { return [...new Set(arr)]; }
原理:
- ES6的Set數(shù)據(jù)結(jié)構(gòu)天生具有元素唯一性特性
- 通過(guò)展開(kāi)運(yùn)算符
...
將Set轉(zhuǎn)換回?cái)?shù)組
優(yōu)點(diǎn):
- 代碼簡(jiǎn)潔,一行搞定
- 性能最佳(O(n)時(shí)間復(fù)雜度)
缺點(diǎn):
- 無(wú)法區(qū)分對(duì)象引用(兩個(gè)內(nèi)容相同的對(duì)象會(huì)被視為不同元素)
- 需要ES6支持
方法2: 使用filter和indexOf
function deduplicateWithFilter(arr) { return arr.filter((item, index) => arr.indexOf(item) === index); }
原理:
indexOf
返回元素第一次出現(xiàn)的索引- 只保留索引匹配的元素
優(yōu)點(diǎn):
- 代碼可讀性好
- 不改變?cè)紨?shù)組
缺點(diǎn):
- 時(shí)間復(fù)雜度O(n²),大數(shù)據(jù)量性能較差
- 同樣無(wú)法處理對(duì)象類型元素
方法3: 使用reduce方法
function deduplicateWithReduce(arr) { return arr.reduce((unique, item) => { return unique.includes(item) ? unique : [...unique, item]; }, []); }
原理:
- 使用reduce累積唯一值
- 通過(guò)includes檢查是否已存在
優(yōu)點(diǎn):
- 函數(shù)式編程風(fēng)格
- 邏輯清晰
缺點(diǎn):
- 每次迭代都創(chuàng)建新數(shù)組(使用
...
展開(kāi)) - 時(shí)間復(fù)雜度O(n²)
方法4: 使用對(duì)象屬性
function deduplicateWithObject(arr) { const obj = {}; return arr.filter(item => { return obj.hasOwnProperty(item) ? false : (obj[item] = true); }); }
原理:
- 利用對(duì)象屬性不可重復(fù)的特性
- 通過(guò)hasOwnProperty檢查存在性
優(yōu)點(diǎn):
- 時(shí)間復(fù)雜度O(n)
- 兼容性好
缺點(diǎn):
- 所有元素會(huì)被轉(zhuǎn)為字符串(如數(shù)字1和字符串"1"會(huì)被視為相同)
- 無(wú)法處理復(fù)雜對(duì)象
性能比較
方法 | 時(shí)間復(fù)雜度 | 適用場(chǎng)景 |
---|---|---|
Set | O(n) | ES6環(huán)境,簡(jiǎn)單數(shù)據(jù)類型 |
filter | O(n²) | 小數(shù)據(jù)量,兼容性要求 |
reduce | O(n²) | 函數(shù)式編程偏好 |
Object | O(n) | 兼容性要求高 |
總結(jié)建議
- 現(xiàn)代項(xiàng)目?jī)?yōu)先使用Set方法,簡(jiǎn)潔高效
- 需要兼容老瀏覽器時(shí)考慮Object方法
- 小數(shù)據(jù)量可使用filter方法增強(qiáng)可讀性
- 注意各種方法對(duì)對(duì)象類型元素的處理差異
提示:對(duì)于包含復(fù)雜對(duì)象的數(shù)組去重,可能需要結(jié)合JSON.stringify或自定義比較函數(shù)實(shí)現(xiàn)更精確的去重邏輯。
到此這篇關(guān)于js篇-數(shù)組去重常見(jiàn)四種方法的文章就介紹到這了,更多相關(guān)js 數(shù)組去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript表單驗(yàn)證開(kāi)發(fā)
這篇文章主要為大家詳細(xì)介紹了JavaScript表單驗(yàn)證開(kāi)發(fā)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Bootstrap時(shí)間選擇器datetimepicker和daterangepicker使用實(shí)例解析
這篇文章主要為大家詳細(xì)解析了Bootstrap時(shí)間選擇器datetimepicker和daterangepicker使用實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-0950行代碼實(shí)現(xiàn)Webpack組件使用次數(shù)統(tǒng)計(jì)
這篇文章主要介紹了50行代碼實(shí)現(xiàn)Webpack組件使用次數(shù)統(tǒng)計(jì),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03javascript實(shí)現(xiàn)驗(yàn)證IP地址等相關(guān)信息代碼
本文給大家分享的是一組判斷IP地址是否合法,判斷子網(wǎng)掩碼是否合法,驗(yàn)證輸入的網(wǎng)關(guān)地址是否合法的javascript代碼,十分的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-05-05JS request函數(shù) 用來(lái)獲取url參數(shù)
項(xiàng)目中經(jīng)常會(huì)遇到這種問(wèn)題 下面代碼解決問(wèn)題!2010-05-05腳本吧 - 幻宇工作室用到j(luò)s,超強(qiáng)推薦share.js
腳本吧 - 幻宇工作室用到j(luò)s,超強(qiáng)推薦share.js...2006-12-12JS關(guān)于刷新頁(yè)面的相關(guān)總結(jié)
在本篇內(nèi)容中我們給大家整理了關(guān)于JS刷新頁(yè)面的所有相關(guān)知識(shí)點(diǎn)以及整理了相關(guān)的技術(shù)文章,大家可以收藏本頁(yè)面繼續(xù)深入學(xué)習(xí)。2018-05-05JavaScript 正則應(yīng)用詳解【模式、欲查、反向引用等】
這篇文章主要介紹了JavaScript 正則應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了JavaScript 正則表達(dá)式模式、欲查、反向引用等相關(guān)概念、原理與操作注意事項(xiàng),需要的朋友可以參考下2020-05-05JavaScript中的"=、==、==="區(qū)別講解
今天小編就為大家分享一篇關(guān)于JavaScript中的"=、==、==="區(qū)別講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01