JavaScript 數組去重:11 種方法對比與實戰指南

文章目錄

    • 前言
    • 一、使用 `Set` 數據結構
    • 二、使用 `filter` + `indexOf`
    • 三、使用 `reduce` 累加器
    • 四、雙重 `for` 循環
    • 五、利用對象屬性唯一性
    • 六、先排序后去重
    • 七、使用 `Map` 數據結構
    • 八、使用 `includes` 方法
    • 九、優化處理 `NaN` 的 `filter` 方法
    • 十、利用 `findIndex`
    • 十一.利用`Set`和展開運算符處理多維數組
    • 總結

前言

一、使用 Set 數據結構

function uniqueBySet(arr){return [...new Set(arr)]
}

利用 Set 數據結構中重復元素會被自動過濾的特點。

  • 優點:簡單高效,時間復雜度為 O(n)。
  • 注意:無法區分對象引用類型,但是可以處理 NaN

二、使用 filter + indexOf

function uniqueByFilter(arr){return arr.filter((item,index)=> arr.indexOf(item) === index)
}

使用 indexOf 返回元素首次出現的索引,若非當前索引則過濾。

  • 注意:時間復雜度為 O(n2),不處理 NaN,因為 indexOf(NaN) 始終返回 -1。

三、使用 reduce 累加器

function uniqueByReduce(arr) {return arr.reduce((acc, cur) => acc.includes(cur) ? acc : [...acc, cur], []);
}

使用 reduce 檢查當前元素是否存在于累加數組中,存在則不添加,不存在則添加。

  • 注意:時間復雜度為 O(n2),空間復雜度較高。

四、雙重 for 循環

function uniqueByLoop(arr) {const result = [];for (let i = 0; i < arr.length; i++) {let isDuplicate = false;for (let j = 0; j < result.length; j++) {if (arr[i] === result[j]) {isDuplicate = true;break;}}if (!isDuplicate) result.push(arr[i]);}return result;
}

通過循環嵌套比較元素是否重復。

  • 注意:時間復雜度為 O(n2),性能較差。

五、利用對象屬性唯一性

function uniqueByObj(arr){const obj = {}return arr.filter(item=>{const key = typeof item + JSON.stringify(item)return obj.hasOwnProperty(key) ? false :(obj[key] = true) })

對象的鍵名唯一,通過序列化來區分不同類型及對象。

  • 注意JSON.stringify 無法處理函數、循環引用,性能一般。

六、先排序后去重

function uniqueBySort(arr) {const sortedArr = [...arr].sort();return sortedArr.filter((item, index) => index === 0 || item !== sortedArr[index - 1]);
}

對數組排序后,重復的元素會相鄰,然后直接過濾。

  • 注意:原數組順序會被改變。

七、使用 Map 數據結構

function uniqueByMap(arr){const map = new Map()return arr.filter(item=>!map.has(item) && map.set(item,true))
}

利用 Map 鍵的唯一性可以快速判斷元素是否存在。

  • 優點:時間復雜度為 O(n),可以正確處理對象引用和 NaN

八、使用 includes 方法

function uniqueByIncludes(arr) {const result = [];for (const item of arr) {if (!result.includes(item)) result.push(item);}return result;
}

在遍歷時檢查元素是否已存在于結果數組。

  • 注意:時間復雜度為 O(n2),不能處理 NaN

九、優化處理 NaNfilter 方法

function uniqueWithNaN(arr) {const hasNaN = arr.some(item => Number.isNaN(item));const result = arr.filter((item, index) => {if (Number.isNaN(item)) {// 僅保留第一個NaNreturn !hasNaN || (index === arr.findIndex(i => Number.isNaN(i)));}return arr.indexOf(item) === index;});return result;
}

單獨處理 NaN,確保只保留第一個出現的 NaN

  • 優點:該方法兼容 NaN 去重。

十、利用 findIndex

function uniqueByFindIndex(arr) {return arr.filter((item, index) => {return arr.findIndex(i => i === item) === index;});
}

使用 findIndexindexOf 方法類似,但是可以處理自定義處理 NaN

十一.利用Set和展開運算符處理多維數組

function uniqueMultidimensionalArray(arr) {return Array.from(new Set(arr.flat(Infinity)));
}

首先利用flat方法將多維數組扁平化,然后利用Set去除重復元素,最后通過Array.fromSet轉換會數組

  • 注意:該方法只能處理元素為基本類型或可序列化的對象的多維數組。如果數組中包含函數,循環引用等特殊對象,flat方法和Set可能無法正確處理

總結

  • 簡單場景:優先使用 SetMap,簡潔高效。
  • 兼容性要求:使用 filter + indexOf 或者雙重循環。
  • NaN 或者對象:選擇 Map 或改進的對象屬性方法。
  • 排序無影響:排序后去重效率高 。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82501.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ai agent(智能體)開發 python3基礎14:在python 中 總能看到方法里面套方法,那什么時候用這種方式合適呢?

讓人頭疼的方法嵌套還是要去了解的 在 Python 中&#xff0c;方法內部嵌套方法&#xff08;即在類的方法中定義另一個函數&#xff09;是一種常見的代碼組織技巧&#xff0c;它可以在特定場景下帶來以下好處&#xff1a; 1. 代碼復用與邏輯封裝 如果某個方法內部有重復的邏輯…

Yocto項目實戰經驗總結:從入門到高級的全面概覽

本文面向開發者和實際項目經驗者&#xff0c;分享經過大量實戰積累的 Yocto 項目工程經驗和基礎技巧。本文簡明但精彩&#xff0c;應用和觀察相結合&#xff0c;充分適合做為全面進階 Yocto 項目開發的實用指南。 一、入門理解&#xff1a;Yocto 是什么&#xff1f;規劃如何開始…

添加物體.

在cesium中我們可以添加物體進入地圖.我們以廣州塔為例 //生成廣州塔的位置var position2 Cesium.Cartesian3.fromDegrees(113.3191,23.109,100)viewer.camera.setView({//指定相機位置destination: position2, 運行后如圖 我們使用cesium官網提供的代碼為廣州塔在地圖上標點…

正則表達式非捕獲分組?:

一個使用 Java 正則表達式的具體例子&#xff0c;展示了 (ab) 和 (?:ab) 的不同&#xff1a; 示例 1&#xff1a;使用 (ab)&#xff08;捕獲分組&#xff09; import java.util.regex.*; public class RegexExample { public static void main(String[] args) { …

ragflow報錯:KeyError: ‘\n “序號“‘

環境&#xff1a; ragflowv 0.17.2 問題描述&#xff1a; ragflow報錯&#xff1a;KeyError: ‘\n “序號”’ **1. 推薦表&#xff08;輸出json格式&#xff09;** [{"},{},{"},{} ]raceback (most recent call last): May 08 20:06:09 VM-0-2-ubuntu ragflow-s…

Spring Boot-8啟動涉及的監聽器(擴展點)

從出現時間上看&#xff1a; org.springframework.context.ApplicationListener&#xff0c;Spring 1.0開始出現 org.springframework.context.ApplicationContextInitializer&#xff0c;Spring 3.1開始出現 org.springframework.boot.SpringApplicationRunListener&#x…

如何啟動vue項目及vue語法組件化不同標簽應對的作用說明

如何啟動vue項目及vue語法組件化不同標簽應對的作用說明 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是node.js和vue的使用。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性。【幫幫志系列文章】&…

思考:(linux) tmux 超級終端快速入門的宏觀思維

tmux 工具集合 GitHub - rothgar/awesome-tmux: A list of awesome resources for tmux 要點&#xff1a; 習慣性思維的變換與宿主機之間的雙向復制、粘貼手動備份全部窗口&#xff0c;以及還原自定義窗格提示信息TPM 插件的安裝思想別名 在有些場景里&#xff0c;可能無法…

Python實例題:Python協程詳解公開課

目錄 Python實例題 題目 課程目標 課程內容規劃 1. 課程開場&#xff08;5 分鐘&#xff09; 2. 基礎概念講解&#xff08;15 分鐘&#xff09; 并發與并行&#xff1a; 線程與進程&#xff1a; 3. Python 協程的實現方式&#xff08;20 分鐘&#xff09; 生成器實現…

AI時代的數據可視化:未來已來

你有沒有想過&#xff0c;數據可視化在未來會變成什么樣&#xff1f;隨著人工智能&#xff08;AI&#xff09;的飛速發展&#xff0c;數據可視化已經不再是簡單的圖表和圖形&#xff0c;而是一個充滿無限可能的智能領域。AI時代的可視化不僅能自動解讀數據&#xff0c;還能預測…

強化學習PPO算法學習記錄

1. 四個模型&#xff1a; Policy Model&#xff1a;我們想要訓練的目標語言模型。我們一般用SFT階段產出的SFT模型來對它做初始化。Reference Model&#xff1a;一般也用SFT階段得到的SFT模型做初始化&#xff0c;在訓練過程中&#xff0c;它的參數是凍結的。Ref模型的主要作用…

邊緣計算從專家到小白

“云-邊-端”架構 “云” &#xff1a;傳統云計算的中心節點&#xff0c;是邊緣計算的管控端。匯集所有邊緣的感知數據、業務數據以及互聯網數據&#xff0c;完成對行業以及跨行業的態勢感知和分析。 “邊” &#xff1a;云計算的邊緣側&#xff0c;分為基礎設施邊緣和設備邊緣…

Windows:Powershell的使用

文章目錄 零、格式化輸出命令1、Format-List&#xff08;別名&#xff1a;fl&#xff09; 一、服務管理SC命令二、軟件管理命令三、權限管理命令1、Get-Acl2、Set-Acl 總結 零、格式化輸出命令 1、Format-List&#xff08;別名&#xff1a;fl&#xff09; 可通過管道符傳遞對象…

實現在h5中添加日歷提醒:safari喚起系統日歷,其它瀏覽器跳轉google日歷

需求&#xff1a;點擊按鈕后&#xff0c;將設定的一些信息插入到系統日歷的日程安排中。 調研過程 先google了一段時間&#xff0c;了解該需求大概的實現方式。可以創建日歷文件&#xff0c;在點擊的時候下載該日歷文件&#xff0c;看起來還比較復雜&#xff0c;并且由于不具…

【Bluedroid】藍牙 HID 設備服務注冊流程源碼解析:從初始化到 SDP 記錄構建

本文圍繞藍牙 HID&#xff08;人機接口設備&#xff09;服務注冊流程&#xff0c;詳細解析從 HID 服務啟用、設備初始化、L2CAP 通道注冊到 SDP&#xff08;服務發現協議&#xff09;記錄構建的全流程。通過分析關鍵函數如btif_hd_service_registration、BTA_HdEnable、HID_Dev…

Win10無法上網:Windows 無法訪問指定設備、路徑或文件。你可能沒有適當的權限訪問該項目找不到域 TEST 的域控制器DNS 解析存在問題

目錄 一.先看問題 二.解決問題 三.補充備用 一.先看問題 Win08有網且已經加入域 Win10無網并且找不到域&#xff08;說明&#xff1a;Win10我之前已經加入過域的&#xff0c;并且能夠上網&#xff0c;但每次在宿舍和教室切換校園網&#xff0c;就會導致只有Win10無網&#…

M0基礎篇之ADC

本節課使用到的例程 一、Single模式例程基本配置的解釋 在例程中我們只使用到了PA25這一個通道&#xff0c;因此我們使用的是Single這個模式&#xff0c;也就是我們在配置模式的時候使用的是單一轉換。 進行多個通道的測量我們可以使用Sequence這個模式。 二、Single模式例程基…

淺談裝飾模式

一、前言 hello大家好&#xff0c;本次打算簡單聊一下裝飾者模式&#xff0c;其實寫有關設計模式的內容還是蠻有挑戰性的&#xff0c;首先呢就是小永哥實力有限擔心說不明白&#xff0c;其次設計模式是為了解決某些問題場景&#xff0c;在當前技術生態圈如此完善的情況下&#…

04 mysql 修改端口和重置root密碼

當我們過了一段時間&#xff0c;忘了自己當初創建的數據庫密碼和端口&#xff0c;或者端口被占用了&#xff0c;要怎么處理呢 首先&#xff0c;我們先停止mysql。 一、修改端口 打開my.ini文件&#xff0c;搜索port&#xff0c;默認是3306&#xff0c;根據你的需要修改為其他…

【基于 LangChain 的異步天氣查詢1】異步調用 Open-Meteo API 查詢該城市當前氣溫

目錄 一、功能概述 二、文件結構 三、城市天氣實時查詢&#xff08;運行代碼&#xff09; weather_runnable.py main.py 運行結果 四、技術亮點 五、使用場景 一、功能概述 它實現了以下主要功能&#xff1a; 用戶輸入地點&#xff08;城市名&#xff09; 構造提示詞…