ES6 Map 數據結構是用總結

1. Map 基本概念

Map 是 ES6 提供的新的數據結構,它類似于對象,但是"鍵"的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。Map 也可以跟蹤鍵值對的原始插入順序。

1.1 基本用法

// 創建一個空Map
const map = new Map();// 創建一個帶有初始值的Map
const map1 = new Map([['name', 'John'],['age', 25]
]);// 使用對象作為鍵
const objKey = { id: 1 };
const map2 = new Map();
map2.set(objKey, 'value for object');// Map的大小
console.log(map1.size); // 2let myMap = new Map();
myMap.set("name", "Alice");
myMap.set(1, "one");
myMap.set(true, "boolean");
console.log(myMap); // Map { 'name' => 'Alice', 1 => 'one', true => 'boolean' }

1.2 Map的基本方法

const map = new Map();// 添加鍵值對
map.set('name', 'John');
map.set('age', 25).set('city', 'New York'); // 支持鏈式調用// 獲取值
console.log(map.get('name')); // 'John'// 檢查鍵是否存在
console.log(map.has('age')); // true// 刪除鍵值對
map.delete('age');// 清空Map
map.clear();// 獲取Map的大小
console.log(map.size); // 0
方法說明
set(key, value)添加鍵值對
get(key)獲取鍵對應的值
delete(key)刪除某個鍵值對
has(key)判斷某個鍵是否存在
clear()清空 Map
size獲取鍵值對數量
console.log(myMap.get("name")); // Alice
console.log(myMap.has(1)); // true
myMap.delete(true);
console.log(myMap.size); // 2
myMap.clear();
console.log(myMap.size); // 0

2. Map的遍歷

2.1 遍歷方法

const map = new Map([['name', 'John'],['age', 25],['city', 'New York']
]);// keys() - 返回鍵名的遍歷器
for (let key of map.keys()) {console.log(key);
}// values() - 返回鍵值的遍歷器
for (let value of map.values()) {console.log(value);
}// entries() - 返回鍵值對的遍歷器
for (let [key, value] of map.entries()) {console.log(key, value);
}// forEach() - 使用回調函數遍歷
map.forEach((value, key) => {console.log(key, value);
});let map = new Map([["name", "Alice"],["age", 25],["gender", "female"]
]);console.log([...map.keys()]); // ['name', 'age', 'gender']
console.log([...map.values()]); // ['Alice', 25, 'female']
console.log([...map.entries()]); // [['name', 'Alice'], ['age', 25], ['gender', 'female']]

2.2 與對象的轉換

// Map轉對象
function mapToObject(map) {const obj = {};for (let [key, value] of map) {obj[key] = value;}return obj;
}// 對象轉Map
function objectToMap(obj) {return new Map(Object.entries(obj));
}// 使用示例
const map = new Map([['name', 'John'], ['age', 25]]);
const obj = mapToObject(map);
const backToMap = objectToMap(obj);

3. 實際應用場景

3.1 緩存系統

class Cache {constructor() {this.cache = new Map();}set(key, value, ttl = 60000) { // 默認緩存1分鐘const expires = Date.now() + ttl;this.cache.set(key, { value, expires });}get(key) {const data = this.cache.get(key);if (!data) return null;if (Date.now() > data.expires) {this.cache.delete(key);return null;}return data.value;}clear() {this.cache.clear();}
}// 使用示例
const cache = new Cache();
cache.set('user', { id: 1, name: 'John' }, 5000); // 緩存5秒
console.log(cache.get('user')); // { id: 1, name: 'John' }

3.2 狀態管理

class StateManager {constructor() {this.states = new Map();this.listeners = new Map();}setState(key, value) {this.states.set(key, value);if (this.listeners.has(key)) {this.listeners.get(key).forEach(listener => listener(value));}}getState(key) {return this.states.get(key);}subscribe(key, callback) {if (!this.listeners.has(key)) {this.listeners.set(key, new Set());}this.listeners.get(key).add(callback);}
}// 使用示例
const store = new StateManager();
store.subscribe('theme', theme => console.log(`Theme changed to ${theme}`));
store.setState('theme', 'dark'); // 輸出: Theme changed to dark

3.3 事件總線

class EventBus {constructor() {this.events = new Map();}on(event, callback) {if (!this.events.has(event)) {this.events.set(event, new Set());}this.events.get(event).add(callback);}off(event, callback) {if (this.events.has(event)) {this.events.get(event).delete(callback);}}emit(event, data) {if (this.events.has(event)) {this.events.get(event).forEach(callback => callback(data));}}
}// 使用示例
const bus = new EventBus();
bus.on('userLogin', user => console.log(`${user.name} logged in`));
bus.emit('userLogin', { name: 'John' }); // 輸出: John logged in

3.4 數據結構映射

class BiMap {constructor() {this.forward = new Map();this.reverse = new Map();}set(key, value) {this.forward.set(key, value);this.reverse.set(value, key);}getByKey(key) {return this.forward.get(key);}getByValue(value) {return this.reverse.get(value);}
}// 使用示例
const userRoles = new BiMap();
userRoles.set('john', 'admin');
console.log(userRoles.getByKey('john')); // 'admin'
console.log(userRoles.getByValue('admin')); // 'john'

4. WeakMap

WeakMap 是一種特殊的 Map,它只接受對象作為鍵,并且鍵是弱引用。

4.1 基本用法

const wm = new WeakMap();
let key = { id: 1 };
wm.set(key, 'value');console.log(wm.get(key)); // 'value'
key = null; // key對象可被垃圾回收

4.2 實際應用場景

// 使用 WeakMap 存儲私有數據
const privateData = new WeakMap();class User {constructor(name, age) {privateData.set(this, { name, age });}getName() {return privateData.get(this).name;}getAge() {return privateData.get(this).age;}
}const user = new User('John', 25);
console.log(user.getName()); // 'John'

4.3 Map 與 WeakMap 的區別**

特性MapWeakMap
是否存儲值? 是? 是
是否存儲對象? 是? 僅能存對象
是否支持遍歷? 是? 不能遍歷
是否允許自動垃圾回收? 否? 是

📌 WeakMap 適用于 存儲對象的私有數據,對象若被其他變量引用解除,會被自動回收,不會造成內存泄漏。

let weakMap = new WeakMap();
let obj = { name: "John" };
weakMap.set(obj, "privateData");
console.log(weakMap.get(obj)); // privateData
obj = null; // 當對象無引用時會被垃圾回收

5. 性能考慮

5.1 Map vs Object

特性MapObject
鍵的類型任意類型僅字符串或 Symbol
是否有默認原型? 否? 是(Object.prototype
遍歷順序按插入順序無序(ES6 之后部分實現有序)
適合場景需要鍵值存儲,鍵可為任意類型傳統鍵值對、JSON 結構
// Map 在頻繁增刪鍵值對時性能更好
const map = new Map();
const obj = {};console.time('Map');
for (let i = 0; i < 1000000; i++) {map.set(i, i);map.delete(i);
}
console.timeEnd('Map');console.time('Object');
for (let i = 0; i < 1000000; i++) {obj[i] = i;delete obj[i];
}
console.timeEnd('Object');let obj = {};
obj["1"] = "one";
obj[1] = "number one";
console.log(obj); // { '1': 'number one' }  因為 Object 的鍵被轉換為字符串let map = new Map();
map.set("1", "one");
map.set(1, "number one");
console.log(map); // Map { '1' => 'one', 1 => 'number one' }

5.2 內存優化

// 及時清理不需要的數據
function processData(data) {const map = new Map();// 處理數據...map.clear(); // 及時清空釋放內存
}

6. 最佳實踐

  1. 需要非字符串鍵時使用 Map
  2. 需要保持鍵值對順序時使用 Map
  3. 頻繁增刪鍵值對時使用 Map
  4. 存儲私有數據時考慮使用 WeakMap
  5. 需要遍歷鍵值對時使用 Map
  6. 注意內存管理,及時清理不需要的數據

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

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

相關文章

計算機視覺語義分割——Attention U-Net(Learning Where to Look for the Pancreas)

計算機視覺語義分割——Attention U-Net(Learning Where to Look for the Pancreas) 文章目錄 計算機視覺語義分割——Attention U-Net(Learning Where to Look for the Pancreas)摘要Abstract一、Attention U-Net1. 基本思想2. Attention Gate模塊3. 軟注意力與硬注意力4. 實驗…

韶音科技:消費電子行業售后服務實現數字化轉型,重塑客戶服務體系

韶音科技&#xff1a;消費電子行業售后服務實現數字化轉型&#xff0c;重塑客戶服務體系 在當今這個科技日新月異的時代&#xff0c;企業之間的競爭早已超越了單純的產品質量比拼&#xff0c;**售后服務成為了衡量消費電子行業各品牌實力與客戶滿意度的關鍵一環。**深圳市韶音…

機器學習之Transformer 模型

Transformer 模型詳解 Transformer 是由 Vaswani et al. 在 2017 年 提出的模型,最初用于 機器翻譯 任務,并迅速成為自然語言處理(NLP)領域的標準模型架構。與傳統的 RNN(循環神經網絡) 和 LSTM(長短期記憶網絡) 不同,Transformer 的核心思想是 完全基于自注意力機制…

使用 CloudDM 和釘釘流程化管理數據庫變更審批

CloudDM 是一個專為團隊協同工作打造的數據庫數據管控平臺。在管控數據庫安全變更的過程中&#xff0c;為提高效率&#xff0c;CloudDM 接入了釘釘&#xff0c;支持實時通知與移動辦公&#xff0c;滿足廣大企業用戶的實際需求。 本文將介紹如何使用 CloudDM 和釘釘實現高效的數…

【RabbitMQ的重試配置retry】重試配置不生效原因

在Spring Boot項目中&#xff0c;RabbitMQ的retry重試配置不生效可能由以下原因導致&#xff1a; 核心問題定位 retry:enabled: true # ? 配置已開啟max-attempts: 3 # ? 參數有效但實際未觸發重試&#xff0c;可能原因如下&#xff1a; 1. 容器類型不匹配 癥狀表現 配置…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是將DeepSeek功能集成到WPS中的詳細步驟&#xff0c;無需本地部署模型&#xff0c;直接通過官網連接使用&#xff1a;1. 下載并安裝OfficeAI插件 &#xff08;1&#xff09;訪問OfficeAI插件下載地址&#xff1a;OfficeAI助手 - 免費辦公智能AI助手, AI寫作&#xff0c;下載…

程序詩篇里的靈動筆觸:指針繪就數據的夢幻藍圖<7>

大家好啊&#xff0c;我是小象?(?ω?)? 我的博客&#xff1a;Xiao Xiangζ????? 很高興見到大家&#xff0c;希望能夠和大家一起交流學習&#xff0c;共同進步。 今天我們一起來學習轉移表&#xff0c;回調函數&#xff0c;qsort… 目錄 一、轉移表1.1 定義與原理1.3…

使用Jenkins實現鴻蒙HAR應用的自動化構建打包

使用Jenkins實現鴻蒙HAR應用的自動化構建打包 在軟件開發領域&#xff0c;自動化構建是提高開發效率和確保代碼質量的重要手段。特別是在鴻蒙&#xff08;OpenHarmony&#xff09;應用開發中&#xff0c;自動化構建更是不可或缺。本文將詳細介紹如何使用Jenkins命令行工具實現…

漏洞分析 Spring Framework路徑遍歷漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美國威睿&#xff08;VMware&#xff09;公司的一套開源的Java、JavaEE應用程序框架。該框架可幫助開發人員構建高質量的應用。 近期&#xff0c;監測到Spring Framework在特定條件下&#xff0c;存在目錄遍歷漏洞&#xff08;網宿評分&am…

筆記:理解借貸相等的公式

強烈推薦非會計人士&#xff0c;快速了解會計看這個系列的視頻&#xff0c;其中比較燒腦的“借貸相等”公式&#xff0c;這個視頻講解的不錯&#xff1a; 4.小白財務入門-借貸記賬法_嗶哩嗶哩_bilibili 比如這里&#xff0c;錢在銀行卡重&#xff0c;所以銀行存款就是借方…

Java算法技術文章:深入解析排序、搜索與數據結構

引言 在軟件開發的世界里&#xff0c;算法不僅是程序設計的基礎&#xff0c;更是提升軟件性能、優化用戶體驗的關鍵。Java&#xff0c;作為一種廣泛使用的編程語言&#xff0c;提供了豐富的API和標準庫來支持各種算法的實現。本文將深入探討Java中的排序算法、搜索算法以及一些…

Android15音頻進階之MediaRecorder支持通道(一百零五)

簡介: CSDN博客專家、《Android系統多媒體進階實戰》一書作者 新書發布:《Android系統多媒體進階實戰》?? 優質專欄: Audio工程師進階系列【原創干貨持續更新中……】?? 優質專欄: 多媒體系統工程師系列【原創干貨持續更新中……】?? 優質視頻課程:AAOS車載系統+…

個人 Vite 構建性能分析插件開發實踐

Vite 構建分析插件開發實踐 一、開發背景 在個人項目開發中遇到以下問題&#xff1a; &#x1f552; 構建時間波動大&#xff08;30%&#xff09;&#x1f50d; 難以定位耗時模塊&#x1f4c8; 缺乏構建進度反饋 開發目標&#xff1a; 實現模塊級耗時分析提供實時進度預測識…

【Spring】什么是Spring?

什么是Spring&#xff1f; Spring是一個開源的輕量級框架&#xff0c;是為了簡化企業級開發而設計的。我們通常講的Spring一般指的是Spring Framework。Spring的核心是控制反轉(IoC-Inversion of Control)和面向切面編程(AOP-Aspect-Oriented Programming)。這些功能使得開發者…

學習筆記:機器學習中的數學原理(一)

1. 集合 集合分為有限集和無限集&#xff1b; 對于有限集&#xff0c;兩集合元素數相等即為等勢&#xff1b; 對于無限集&#xff0c;兩集合元素存在一一映射關系即為等勢&#xff1b; 無限集根據是否與正整數集等勢分為可數集和不可數集。 2. sigmoid函數&#xff08;也叫…

【信息系統項目管理師-案例真題】2016下半年案例分析答案和詳解

更多內容請見: 備考信息系統項目管理師-專欄介紹和目錄 文章目錄 試題一【問題1】4 分【問題2】12 分【問題3】3 分【問題4】6 分試題二【問題1】3 分【問題2】4 分【問題3】8 分【問題4】5 分【問題5】5 分試題三【問題1】4 分【問題2】8 分【問題3】5 分【問題4】8 分試題一…

基于javaweb的SpringBoothis智能醫院管理系統(源碼+文檔+部署講解)

&#x1f3ac; 秋野醬&#xff1a;《個人主頁》 &#x1f525; 個人專欄:《Java專欄》《Python專欄》 ??心若有所向往,何懼道阻且長 文章目錄 運行環境開發工具適用功能說明一、項目運行 環境配置&#xff1a; 運行環境 Java≥8、MySQL≥5.7、Node.js≥14 開發工具 后端&…

JS實現燈光閃爍效果

在 JS中&#xff0c;我們可以實現燈光閃爍效果&#xff0c;這里主要用 setInterval 和 clearInterval 兩個重要方法。 效果圖 源代碼 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>燈閃爍效果<…

Linux ltrace跟蹤入門

文章目錄 背景ltrace原理ltrace使用跟蹤程序調用庫函數跟蹤指定pid進程調用 參考 本文介紹ltrace跟蹤 背景 ltrace 會攔截并記錄正在執行的進程所調用的動態庫調用以及該進程接收到的信號&#xff0c;它還可以攔截并打印程序執行的系統調用。 其代碼位置在&#xff1a;https:/…

PCA9685 16路PWM 控制板 STM32F103 驅動

PCA9685 擁有16路PWM&#xff0c;通過 IIC 與 STM32 進行通信&#xff0c;以下驅動代碼已通過測試&#xff0c;你可以進行更多代碼優化 #include "pca9685.h"// 向 PCA9685 寫入一個字節數據 static void PCA9685_write8( uint8_t addr, uint8_t d) {while (I2C_Get…