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