JavaScript數(shù)據(jù)結(jié)構(gòu)Map的使用示例詳解
在 JavaScript 中,Map 是 ES6 引入的一種新的數(shù)據(jù)結(jié)構(gòu),它類似于對象,也是鍵值對的集合,但 Map 的鍵可以是任意類型的值(對象、函數(shù)、基本類型等),而傳統(tǒng)對象的鍵只能是字符串或 Symbol,并且Map保留了插入順序。
一、Map 的特性
鍵值對集合:存儲鍵值對,類似對象
鍵的多樣性:鍵可以是任意數(shù)據(jù)類型(對象、函數(shù)、基本類型等),而不僅限于字符串或 Symbol。
保留插入順序:遍歷時按插入順序返回鍵值對
直接獲取大小:通過 size 屬性快速獲取元素數(shù)量
支持迭代:原生支持 for…of、forEach 等遍歷方式
性能優(yōu)化:在頻繁增刪鍵值對的場景下性能更優(yōu)
二、創(chuàng)建 Map
1、創(chuàng)建一個空 Map
const emptySet = new Map();
2、創(chuàng)建一個帶有初始鍵值對的 Map,通過二維數(shù)組初始化
const map2 = new Map([ ['name', '張三'], ['age', 25], [1, '數(shù)字鍵'], [{}, '對象鍵'] ]);
三、Map 的常用屬性和方法
set() 添加元素
const map = new Map(); map.set('name', '李四'); map.set(1, '數(shù)字一'); map.set({id: 1}, '對象鍵值');
get() 獲取元素
console.log(map.get('name')); // 李四 console.log(map.get(1)); // 數(shù)字一
has() 檢查鍵是否存在
console.log(map.has('name')); // true console.log(map.has('address')); // false
delete() 刪除元素
map.delete('name'); console.log(map.has('name')); // false
clear() 清空 Map
map.clear(); console.log(map.size); // 0
size屬性 獲取大小
console.log(map.size); // 元素數(shù)量
四、遍歷 Map
1、 for…of 循環(huán)
const map = new Map([ ['a', 1], ['b', 2], ['c', 3] ]); for (const [key, value] of map) { console.log(key, value); }
2、forEach 方法
map.forEach((value, key) => { console.log(key, value); });
3、獲取迭代器
獲取鍵的迭代器 keys()
for (const key of map.keys()) { console.log(key); }
獲取值的迭代器 values()
for (const value of map.values()) { console.log(value); }
獲取鍵值對的迭代器 entries()
返回一個包含 [key, value] 對的迭代器
for (const [key, value] of map.entries()) { console.log(key, value); }
五、Map 與 Object 的比較
特性 | Map | Object |
---|---|---|
鍵的類型 | 任意值 | String 或 Symbol |
鍵的順序 | 插入順序 | 不一定 |
大小 | size屬性 | 手動計算 |
性能(頻繁增刪) | 更優(yōu) | 一般 |
序列化 | 不能直接JSON序列化 | 可以直接序列化 |
默認鍵 | 無 | 有原型鏈上的鍵 |
六、與對象/數(shù)組的轉(zhuǎn)換
1、對象轉(zhuǎn)為Map
const obj = { a: 1, b: 2 }; const map = new Map(Object.entries(obj));
2、Map轉(zhuǎn)為對象
const map = new Map([["a", 1], ["b", 2]]); const obj = Object.fromEntries(map);
3、Map轉(zhuǎn)為數(shù)組
console.log([...map]); // 轉(zhuǎn)二維數(shù)組 console.log([...map.keys()]); // 所有鍵的數(shù)組
七、使用場景
- 需要鍵不是字符串/符號時:比如要用對象作為鍵
- 需要保持插入順序時:Map 會記住鍵的原始插入順序
- 頻繁增刪鍵值對時:Map 性能更好
- 需要知道數(shù)據(jù)大小時:Map 有 size 屬性
八、使用示例
1、統(tǒng)計字符出現(xiàn)次數(shù)
function countChars(str) { const result = new Map(); for (const char of str) { result.set(char, (result.get(char) || 0) + 1); } return result; } const charCount = countChars('hello world'); console.log(charCount.get('o')); // 2
2、使用復雜對象作為鍵
const user1 = {id: 1, name: 'admin'}; const user2 = {id: 2, name: 'test'}; const userMapData = new Map(); userMapData.set(user1, {roleCode: 'admin', createTime: '2025-04-09'}); userMapData.set(user2, {roleCode: 'user', createTime: '2025-04-09'}); console.log(userMapData.get(user1).roleCode); // 'admin'
3、對象關(guān)聯(lián)元數(shù)據(jù)
dom對象本身作為鍵存儲額外數(shù)據(jù),避免污染對象屬性
const domMetadata = new Map(); const button = document.querySelector("#myButton"); // 綁定點擊次數(shù)元數(shù)據(jù) domMetadata.set(button, { clickCount: 0 }); button.addEventListener("click", () => { const metadata = domMetadata.get(button); metadata.clickCount++; console.log(`點擊次數(shù):${metadata.clickCount}`); });
九、注意事項
1、對象作為鍵時: Map 的鍵是基于引用比較的,兩個看起來相同的對象作為鍵是不同的
const map = new Map(); map.set({}, 'value1'); map.set({}, 'value2'); console.log(map.size, map.get({})); // 2 undefined(不同引用) let obj = {}; map.set(obj, 'value3'); console.log(map.obj); // value3
2、 NaN 作為鍵時: 雖然 NaN !== NaN,但在 Map 中被視作同一鍵
map.set(NaN, 'not a number'); console.log(map.get(NaN)); // 'not a number'
Map 是一種強大且靈活的數(shù)據(jù)結(jié)構(gòu),通過靈活使用 Map,可以更高效地處理復雜鍵類型和有序鍵值對的場景,提升代碼可讀性和性能。
到此這篇關(guān)于JavaScript數(shù)據(jù)結(jié)構(gòu)-Map的使用的文章就介紹到這了,更多相關(guān)js 數(shù)據(jù)結(jié)構(gòu)map內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
微信小程序如何根據(jù)不同用戶切換不同TabBar(簡單易懂!)
小程序中我們可能需要根據(jù)不同的權(quán)限展示不同的tabbar,下面這篇文章主要給大家介紹了關(guān)于微信小程序如何根據(jù)不同用戶切換不同TabBar的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04js將long日期格式轉(zhuǎn)換為標準日期格式實現(xiàn)思路
本文為大家詳細介紹下js將long日期格式轉(zhuǎn)換為標準日期格式,感興趣的朋友可以參考下哈,希望可以幫助到你2013-04-04javascript運動效果實例總結(jié)(放大縮小、滑動淡入、滾動)
這篇文章主要介紹了javascript運動效果,結(jié)合實例形式總結(jié)分析JavaScript實現(xiàn)放大縮小、滑動淡入、滾動等效果的方法,需要的朋友可以參考下2016-01-01JavaScript實現(xiàn)的斑馬線表格效果【隔行變色】
這篇文章主要介紹了JavaScript實現(xiàn)的斑馬線表格效果,通過javascript針對table表格的遍歷與運算實現(xiàn)隔行變色功能,非常簡單實用,需要的朋友可以參考下2017-09-09