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