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')); // falsedelete() 刪除元素
map.delete('name'); console.log(map.has('name')); // falseclear() 清空 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序列化 | 可以直接序列化 |
| 默認(rèn)鍵 | 無 | 有原型鏈上的鍵 |
六、與對象/數(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、使用復(fù)雜對象作為鍵
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 是一種強(qiáng)大且靈活的數(shù)據(jù)結(jié)構(gòu),通過靈活使用 Map,可以更高效地處理復(fù)雜鍵類型和有序鍵值對的場景,提升代碼可讀性和性能。
到此這篇關(guān)于JavaScript數(shù)據(jù)結(jié)構(gòu)Map的使用實例詳解的文章就介紹到這了,更多相關(guān)js map使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
學(xué)習(xí)JavaScript圖片預(yù)加載模塊
這篇文章主要介紹了js實現(xiàn)圖片預(yù)加載的方法,內(nèi)容很詳細(xì),帶領(lǐng)大家全面認(rèn)識js圖片預(yù)加載模塊,感興趣的小伙伴們可以參考一下2016-11-11
JavaScript高級程序設(shè)計 閱讀筆記(十八) js跨平臺的事件
js跨平臺的事件經(jīng)驗分享,需要的朋友可以參考下2012-08-08
el表達(dá)式 寫入bootstrap表格數(shù)據(jù)頁面的實例代碼
這篇文章主要介紹了el表達(dá)式 寫入bootstrap表格數(shù)據(jù)頁面的實例代碼,非常不錯,具有參考借鑒價值,需要的的朋友參考下吧2017-01-01
Underscore.js 的模板功能介紹與應(yīng)用
Underscore是一個非常實用的JavaScript庫,提供許多編程時需要的功能的支持,他在不擴(kuò)展任何JavaScript的原生對象的情況下提供很多實用的功能,需要了解的朋友可以詳細(xì)參考下2012-12-12
JavaScript與Div對層定位和移動獲得坐標(biāo)的實現(xiàn)代碼
JavaScript與Div對層定位和移動獲得坐標(biāo)的實現(xiàn)代碼,需要的朋友可以參考下。2010-09-09
用Javascript評估用戶輸入密碼的強(qiáng)度(Knockout版)
早上看到博友6點多發(fā)的一篇關(guān)于密碼強(qiáng)度的文章(連接),甚是感動(周末大早上還來發(fā)文)2011-11-11
關(guān)于include標(biāo)簽導(dǎo)致js路徑找不到的問題分析及解決
本文為大家詳細(xì)介紹下關(guān)于使用jsp:include標(biāo)簽及<%@ include標(biāo)簽時要注意的事項以及實測發(fā)現(xiàn)問題并解決問題的全過程,感興趣的各位可以參考下哈,希望對大家有所幫助2013-07-07

