JavaScript 性能優化:new Map vs Array.find() 查找速度深度對比

前言

在前端開發中,我們經常需要從數據集合中查找特定元素。對于小規模數據,使用?Array.find()方法簡單直接,但當數據量增大時,性能問題就會顯現。本文將深入對比?Map和?Array.find()在數據查找方面的性能差異,并通過實際測試數據展示它們在不同規模數據集下的表現。

核心概念解析

1. Array.find() 方法

Array.find()是 JavaScript 數組的一個內置方法,它接受一個回調函數作為參數,返回數組中第一個滿足條件的元素。

特點:

  • 時間復雜度:O(n) - 最壞情況下需要遍歷整個數組
  • 適合場景:小規模數據或不需要頻繁查找的情況
  • 語法簡單直觀
  • 保持原始數組結構不變
  • const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
    const user = users.find(item => item.id === 2);

2. Map 數據結構

Map是 ES6 引入的一種鍵值對集合,與普通對象不同,它可以使用任何類型的值作為鍵。

?特點:

  • 時間復雜度:O(1) - 無論數據量多大,查找速度幾乎恒定
  • 適合場景:大規模數據或需要頻繁查找的情況
  • 需要預先構建映射關系
  • 內存占用略高于數組
  • const users = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
    const userMap = new Map(users.map(user => [user.id, user]));
    const user = userMap.get(2);

性能對比測試

測試方法

我們設計了以下測試方案:

  1. 生成不同規模的數據集(500條、2000條、10000條)
  2. 分別測試查找第一個元素、中間元素和最后一個元素
  3. 每種情況執行10000次取平均值
  4. 使用?performance.now()獲取高精度時間
function generateTestData(size) {return Array.from({length: size}, (_, i) => ({id: i+1, name: `用戶${i+1}`}));
}function testPerformance(size, targetId) {const data = generateTestData(size);// 測試Mapconst map = new Map(data.map(item => [item.id, item]));let mapStart = performance.now();for (let i = 0; i < 10000; i++) map.get(targetId);const mapTime = performance.now() - mapStart;// 測試Array.find()let findStart = performance.now();for (let i = 0; i < 10000; i++) data.find(item => item.id === targetId);const findTime = performance.now() - findStart;return {dataSize: size,targetId,mapTime,findTime,difference: findTime - mapTime,timesFaster: (findTime / mapTime).toFixed(2)};
}

結果分析

  1. 1.

    ??數據量影響??:

    • Map的查找時間幾乎不受數據量影響,始終保持在1-2毫秒
    • Array.find()的查找時間與數據量成正比,10000條數據時達到1750毫秒
  2. 2.

    ??查找位置影響??:

    • Map查找任何位置元素時間相同
    • Array.find()查找第一個元素很快,查找最后一個元素最慢
  3. 3.

    ??性能差距??:

    • 小數據量(500條)時,Map快2-68倍
    • 中數據量(2000條)時,Map快146-269倍
    • 大數據量(10000條)時,Map快625-1094倍

何時選擇哪種方案?

使用?Array.find()的情況:

  • 數據量很小(<100條)
  • 只需要偶爾查找
  • 代碼可讀性優先
  • 不需要額外內存開銷

使用?Map的情況:

  • 數據量中等或較大(>100條)
  • 需要頻繁查找
  • 性能是關鍵因素
  • 可以接受初始化的額外開銷

最佳實踐建議

1.??數據預處理??:

// 初始化時創建Map
const data = [...]; // 原始數據
const dataMap = new Map(data.map(item => [item.id, item]));

2.??動態維護??:?如果數據會動態變化,需要同時維護數組和Map:

let data = [];
let dataMap = new Map();function addItem(item) {data.push(item);dataMap.set(item.id, item);
}

3.??封裝工具函數??:

function createIndexedCollection(data, key) {return {data,index: new Map(data.map(item => [item[key], item])),get(id) {return this.index.get(id);},add(item) {this.data.push(item);this.index.set(item[key], item);}};
}

結論

通過本文的測試和分析,我們可以清晰地看到:

  1. Map在數據查找方面具有絕對性能優勢,特別是對于大規模數據
  2. Array.find()僅適合小規模數據或簡單場景
  3. 隨著數據量增大,兩者的性能差距呈指數級擴大

在實際項目中,開發者應該根據具體場景選擇合適的數據結構。對于需要頻繁查找的中大型數據集,使用?Map可以顯著提升應用性能,提供更好的用戶體驗。

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

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

相關文章

棧與隊列leetcode題型總結

1. 常用表格總結數據結構常見應用場景時間復雜度&#xff08;入/出/查&#xff09;LeetCode 高頻題棧&#xff08;Stack&#xff09;括號匹配、單調棧、DFS入棧 O(1) / 出棧 O(1) / 查頂 O(1)20 有效的括號, 155 最小棧, 739 每日溫度隊列&#xff08;Queue&#xff09;層序遍歷…

云原生俱樂部-RH124知識點總結(3)

寫到這RH124的內容已經過半了&#xff0c;雖然內容不多&#xff0c;但是還是不太好寫。因為簡單的命令不想寫&#xff0c;至于理解上也沒什么難度&#xff0c;不過還是要保證整體內容的都要講到。這篇文章就把RH124剩下的內容都完結吧&#xff0c;主要還剩下配置和保護SSH、管理…

安裝DDNS-go

wget https://github.com/jeessy2/ddns-go/releases/download/v6.12.2/ddns-go_6.12.2_linux_x86_64.tar.gz tar zxvf ddns-go_6.12.2_linux_x86_64.tar.gz sudo ./ddns-go -s install

機器學習深度學習 所需數據的清洗實戰案例 (結構清晰、萬字解析、完整代碼)包括機器學習方法預測缺失值的實踐

礦物數據.xls礦物種類&#xff1a;A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E&#xff08;其中E數據只有一條&#xff0c;無法用于訓練&#xff0c;直接剔除&#xff09;特征&#xff1a;序號 氯 鈉 鎂 硫 鈣 鉀 碳 溴 鍶 pH 硼 氟 硒 礦物類型此數據有&#xff1…

從基礎到架構的六層知識體系

第1層&#xff1a;數學與邏輯基礎&#xff08;The Foundation&#xff09;&#x1f4cc; 計算機技術的根源&#xff1b;為算法分析、密碼學、AI等提供理論支撐離散數學&#xff1a;集合、圖論、邏輯、遞歸線性代數&#xff1a;機器學習、圖形學基礎概率與統計&#xff1a;數據分…

Flask 路由與視圖函數綁定機制

Flask 路由與視圖函數綁定機制 核心概念 在 Flask 框架中&#xff0c;路由&#xff08;Route&#xff09; 是連接 URL 路徑與 Python 函數的橋梁&#xff0c;通過 app.route() 裝飾器實現這種綁定關系&#xff0c;使得當用戶訪問特定 URL 時&#xff0c;對應的函數會被自動調用…

Spring 的 setter 注入可以解決某些類型的循環依賴問題

參考&#xff1a;https://blog.csdn.net/weixin_50055999/article/details/147493914?utm_sourceminiapp_weixin Setter 方法注入 (Setter Injection) 在類中提供一個 setter 方法&#xff0c;并在該方法上使用 Autowired、Resource 等注解。 代碼示例 import org.springfr…

數據結構代碼分享-5 鏈式棧

linkstack.c#include<stdio.h> #include<stdlib.h> #include"linkstack.h" //1.創建一個空的棧 void CreateEpLinkStack(linkstack_t **ptop) {*ptop NULL; } //2.入棧,ptop是傳入的棧針的地址&#xff0c;data是入棧的數據 int pushLinkStack(linkstac…

數學建模Topsis法筆記

評價決策類-Topsis法學習筆記 問題的提出 生活中我們常常要進行評價&#xff0c;上一篇中的層次分析法&#xff0c;通過確定各指標的權重&#xff0c;來進行打分&#xff0c;但層次分析法決策層不能太多&#xff0c;而且構造判斷矩陣相對主觀。那有沒有別的方法呢&#xff1f…

石英加速度計為何成為行業標桿?

在石油鉆井、航空航天、工業自動化等領域&#xff0c;高精度、高可靠性的加速度測量至關重要。ER-QA-03F系列石英撓性加速度計憑借其卓越的性能和穩定的表現&#xff0c;成為靜態與動態測試的理想選擇。自2012年推出以來&#xff0c;該產品已交付數千臺&#xff0c;并在石油鉆井…

HP Pavilion G6 筆記本使用ventoy啟動安裝Ubuntu 22.04 桌面版

HP Pavilion G6 筆記本是很老的筆記本了&#xff0c;淘到一款&#xff0c;成色比較新&#xff0c;使用i5 3210 M cpu &#xff0c;內存是2G*2&#xff0c;正好手邊有一條4G內存條&#xff0c;替換一條后擴充為6G內存&#xff0c;感覺可以再戰10年&#xff01;&#xff08;當然6…

STM32G4 Park及反Park變換(二)實驗

目錄 一、STM32G4 Park及反Park變換(二)實驗 1 Park及反Park變換 1.1 代碼 1.2 上位機實驗結果 附學習參考網址 歡迎大家有問題評論交流 (* ^ ω ^) 一、STM32G4 Park及反Park變換(二)實驗 1 Park及反Park變換 本文介紹了基于STM32G4的Park及反Park變換實驗過程。主要內容…

pgsql 如何查詢今天范圍內的數據(當天0點0分0秒 - 當天23點59分59秒....)

使用 CURRENT_DATE 函數CURRENT_DATE 返回當前日期&#xff08;不含時間部分&#xff09;。當它在查詢中與 timestamp 字段比較時&#xff0c;會自動被視為當天的開始&#xff0c;即 YYYY-MM-DD 00:00:00。CURRENT_DATE INTERVAL 1 day 計算出第二天的開始時間&#xff0c;即 …

DRM驅動架構淺析-上(DRM基礎概要與U-Boot階段驅動解析)

一、背景 近期項目吃緊&#xff0c;接了不少調屏相關的需求&#xff0c;期間磕磕絆絆&#xff0c;但總算完成要求。回首過往&#xff0c;調試過多種屏幕&#xff0c;包括LVDS、EDP、MIPI、MI轉EDP或是轉LVDS、DP以及HDMI等常見屏。在Rockchip平臺調外設也有段時間矣&#xff0…

idea中如何設置文件的編碼格式

目錄 一、全局與項目編碼配置 二、新項目預配置 一、全局與項目編碼配置 File --> Settings --> Editor --> File Encodings Global Encoding&#xff1a;設置為UTF-8&#xff0c;影響IDE界面及新建文件的默認編碼。??Project Encoding&#xff1a;選擇UTF-8&am…

2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(六)

本文主要回顧2025年上半年(2025-5-24)系統架構設計師考試上午綜合知識科目的選擇題,同時附帶參考答案、解析和所涉知識點。 2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(一) 2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(…

Ubuntu22系統上源碼部署LLamaFactory+微調模型 教程【親測成功】

0.LLamaFactory LLaMA-Factory 是一個開源的低代碼大模型訓練與微調框架&#xff0c;旨在簡化大規模語言模型&#xff08;LLM&#xff09;的微調、評估和部署流程&#xff0c;幫助開發者和研究人員更高效地定制和優化模型。 1.安裝部署 1.1克隆倉庫 git clone --depth 1 ht…

打靶日常-sql注入(手工+sqlmap)

小知識: 注入點:在哪里輸入sgl指令中的參數 執行點:在那個頁面拼接sql指令并發送給數據庫執行 回顯點:執行的結果顯示在哪個頁面 sqlmap知識點: 輸出等級 -v3 范圍0-6 默認1 一般3 考試3 測試等級 --level=1 范圍…

繞過服務端文件上傳檢測:黑名單繞過技術與實戰

繞過服務端文件上傳檢測&#xff1a;黑名單繞過技術與實戰文件上傳漏洞是Web安全中常見且危害極大的漏洞類型之一&#xff0c;而黑名單機制是最基礎的防御手段。本文將深入探討三種經典的黑名單繞過技術&#xff0c;并提供實戰案例與防御方案。引言 文件上傳功能是現代Web應用的…

在職老D滲透日記day21:sqli-labs靶場通關(第27a關)get聯合注入 過濾select和union “閉合

5.27a.第27a關 get聯合注入 過濾select和union "閉合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip …