JavaScript中的Map數(shù)據(jù)結(jié)構(gòu)詳解
1. 什么是 Map
Map 就是映射的意思,即從鍵到值的映射。
Map 保存鍵值對(duì),并且能夠記住鍵的原始插入順序。
那么它和 Object 有什么區(qū)別 ?
對(duì)象一般用字符串作鍵
const obj = {
val : "object"
}
任何值(對(duì)象或者原始值) 都可以作為 Map 的一個(gè)鍵或一個(gè)值
const m = new Map();;
m.set('val', 'map');
m.set(1, 'number');
m.set(new Set([1, 2]), 'set');
m.set({}, 'object');
console.log(m);

所以,在鍵值對(duì)的數(shù)據(jù)結(jié)構(gòu)中,Map 比 Object 更為合適
2. Map 構(gòu)造函數(shù)
對(duì)于 Set 的構(gòu)造函數(shù)的參數(shù),可以傳遞以下幾種形式。
2.1) 數(shù)組
注意,要傳遞的是二維數(shù)組,因?yàn)槎S數(shù)組才能體現(xiàn)出鍵值對(duì)
const m = new Map([
['val', 'map'],
['apple', 'fruit']
]);
console.log(m);

2.2) Set
以 Set 作為參數(shù),也要體現(xiàn)出鍵值對(duì)形式
對(duì) Set 不了解的,想了解的可以看看下面這篇文章:JavaScript—Set
const m = new Map(new Set([
['tigger', 'animal'],
['orange', 'fruit']
]));
console.log(m);

2.3) Map
const m1 = new Map([
['watermelon', 'fruit'],
['cat', 'animal']
])
const m2 = new Map(m1);
console.log(m2);

這里相當(dāng)于把m1復(fù)制過(guò)去,給了m2,不過(guò)它們不是同一個(gè) Map
console.log(m2 === m1);

綜上,Map 構(gòu)造函數(shù)的參數(shù)要能體現(xiàn)出鍵值對(duì)的形式。
3. Map 的實(shí)例屬性和方法
3.1) Map 的屬性
size
Map 的屬性,有一個(gè)屬性size,用來(lái)存儲(chǔ)它的成員個(gè)數(shù)
const m = new Map([
['val', 'map'],
['cat', 'animal'],
['orange', 'fruit']
]);
console.log(m.size);

3.2) Map 的方法
set
給 Map 中添加成員
const m = new Map();
// 它的參數(shù)為兩個(gè),第一個(gè)為鍵,第二個(gè)為值
m.set('val', 'map');
console.log(m);
// 可以連綴 Set
m.set('orange', 'fruit').set('cat', 'animal');
console.log(m);
// 添加的新成員如果鍵已經(jīng)存在了,那么將會(huì)覆蓋它
// 鍵的順序不會(huì)發(fā)生改變,因?yàn)?Map 能夠記住鍵的原始插入順序
m.set('orange', 'sweet');
console.log(m);

get
通過(guò)鍵獲取 Map 的成員
const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
console.log(m.get('val'));
console.log(m.get(true));
// 獲取不存在的鍵時(shí),會(huì)返回 undefined
console.log(m.get('tigger'));

has
用來(lái)判斷 Map 是否含有某個(gè)鍵
const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
console.log(m.has(true));
console.log(m.has('true'));

delete
通過(guò)鍵,來(lái)刪除 Map 中的成員
const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
m.delete('cat');
// 刪除不存在的成員,將什么也不會(huì)發(fā)生,也不會(huì)報(bào)錯(cuò)
m.delete('true');
console.log(m);

clear
刪除 Map 的所有成員
const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
m.clear();
console.log(m);

forEach
用來(lái)遍歷 Map 的成員
它有兩個(gè)參數(shù),第一個(gè)參數(shù)為回調(diào)函數(shù),第二個(gè)參數(shù)設(shè)定回調(diào)函數(shù)中this指向什么,即
m.forEach(回調(diào)函數(shù), 回調(diào)函數(shù)的指向)
先來(lái)看第一個(gè)參數(shù)
m.forEach(function(value, key, map){
value 就是 Map 的值
key 就是 Map 的鍵
map 就是前面Map的本身,即這里 map === m
});
通過(guò)一個(gè)例子理解一下:
const m = new Map([ ['val', 'map'], ['orange', 'fruit'], ['cat', 'animal'], [true, 'false']]);m.forEach(function(value, key, map) { console.log(value, key, map == m);});const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
m.forEach(function(value, key, map) {
console.log(value, key, map == m);
});

再來(lái)看第二個(gè)參數(shù)
const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
m.forEach(function(value, key, map) {
console.log(this);
}, document);
const m = new Map([
['val', 'map'],
['orange', 'fruit'],
['cat', 'animal'],
[true, 'false']
]);
m.forEach(function(value, key, map) {
console.log(this);
}, document);

4. Map的注意事項(xiàng)
Map 對(duì)鍵名是否相同的判斷基本遵循嚴(yán)格相等===的判斷
不過(guò)對(duì)于NaN,在 Set 中,NaN 等于 NaN
5. Map的使用場(chǎng)景
- 只需要鍵值對(duì)的結(jié)構(gòu)時(shí),即 key => value 的結(jié)構(gòu)
- 需要字符串以外的鍵或者值
舉個(gè)例子來(lái)看看 Map 的應(yīng)用:
對(duì)DOM元素進(jìn)行操作
先寫(xiě)一個(gè) HTML 代碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Map</title>
</head>
<body>
<p>one</p>
<p>two</p>
<p>three</p>
</body>
</html>
此時(shí)效果是這樣的:

然后對(duì)p元素進(jìn)行修改:
<script>
// 利用數(shù)組解構(gòu)賦值將 p 元素獲取的同時(shí)解構(gòu)出來(lái)
const [p1, p2, p3] = document.querySelectorAll('p');
const m = new Map([
[p1, new Map([
['color', 'blue'],
['fontSize', '40px']
])],
[p2, new Map([
['color', 'orange'],
['fontSize', '40px']
])],
[p3, new Map([
['color', 'green'],
['fontSize', '40px']
])]
]);
m.forEach((propMap, elem) => {
propMap.forEach((value, prop) => {
elem.style[prop] = value;
});
});
</script>

總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
JavaScript實(shí)現(xiàn)將數(shù)組中所有元素連接成一個(gè)字符串的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)將數(shù)組中所有元素連接成一個(gè)字符串的方法,涉及javascript中采用join方法進(jìn)行數(shù)組轉(zhuǎn)化的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04
JavaScript+html5 canvas繪制漸變區(qū)域完整實(shí)例
這篇文章主要介紹了JavaScript+html5 canvas繪制漸變區(qū)域的方法,結(jié)合完整實(shí)例形式分析了canvas顏色調(diào)用與圖形繪制的相關(guān)技巧,需要的朋友可以參考下2016-01-01
Flutter 超實(shí)用簡(jiǎn)單菜單彈出框 PopupMenuButton功能
這篇文章主要介紹了Flutter 超實(shí)用簡(jiǎn)單菜單彈出框 PopupMenuButton功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
前淘寶前端開(kāi)發(fā)工程師阿當(dāng)?shù)腜PT中有JS技術(shù)理念問(wèn)題
第一屆 web rebuild 北京會(huì)有個(gè)前淘寶前端開(kāi)發(fā)工程師阿當(dāng)分享的 PPT 在公司團(tuán)隊(duì)內(nèi)部有同事下載的分享,然后看了。發(fā)現(xiàn)了有些技術(shù)理念的問(wèn)題:2010-01-01
javascript網(wǎng)頁(yè)關(guān)鍵字高亮代碼
非常不錯(cuò)的關(guān)鍵字高亮代碼,用js實(shí)現(xiàn),這個(gè)方法不錯(cuò)2008-07-07

