Map結(jié)構(gòu)的目的和基本用法
js里面的對(duì)象(Object)本質(zhì)上是鍵值對(duì)的集合(Hash結(jié)構(gòu)),但是只能以字符串做為鍵。這給它帶來(lái)很大的限制。
var data = {};
var element = document.getElementById('myDiv');
data[element] = 'metadata'
data// {'[object HTMLDivElement]':'test'}
上面使用
DOM節(jié)點(diǎn)作為對(duì)象data的健,因?yàn)閷?duì)象只接受字符串為鍵,所以默認(rèn)被轉(zhuǎn)為了字符串(調(diào)用toString())。
為了解決這個(gè)問(wèn)題,ES6提供了Map數(shù)據(jù)結(jié)構(gòu)。
1.它類似于對(duì)象,也是鍵值對(duì)的集合,但是它的健不受類型的限制,各種類型的值都可以當(dāng)做它的健。
- 對(duì)象結(jié)構(gòu)是字符串和值的對(duì)應(yīng),而
Map是值與值的對(duì)應(yīng),是一種更完善的Hash結(jié)構(gòu)實(shí)現(xiàn)。
- 對(duì)象作為健
var o = {p:'hello'};
var m = new Map();
m.set(o:'cotent')
m.get(o) //'cotent'
m.has(o) //true
m.delete(o)// true ;
m.has(o) //false
-
Map作為構(gòu)造函數(shù),它能接受數(shù)組作為參數(shù),但是數(shù)組必成員必須是作為鍵值對(duì)的數(shù)組。
var m = new Map([['name','張三'],['title','author']])
m //Map(2) {"name" => "張三", "title" => "author"}
- 如果是同一個(gè)鍵多次賦值,那和對(duì)象一樣,后面的值將覆蓋前面的。
var m = new Map([['name','張三'],['name','李四']])
m.get('name') // "李四"
m.set('name','王五')
m.get('name') // "王五"
- 注意對(duì)象類型作為鍵的容易出現(xiàn)的錯(cuò)誤,要區(qū)分引用類型。
var m = new Map();
m.set({name:'趙六'},'test');
m.get({name:'趙六'}); //undefined
//要區(qū)分唯一引用
var a = {name:'趙六'};
var b = {name:'趙六'};
m.set(a,'趙六,的媳婦');
m.set(b,'另一個(gè)趙六,的媳婦');
m.get(a)//'趙六,的媳婦'
m.get(b)//'另一個(gè)趙六,的媳婦'
map結(jié)構(gòu)與數(shù)組以及對(duì)象之間的相互轉(zhuǎn)換。
- map與數(shù)組之間的轉(zhuǎn)換。
var map = new Map().set([1,2,3],"數(shù)組鍵的值").set('name',"余佳").set(0,[ 4, 5, 6 ])
var mapToArr = [...map]
//[ [ [1, 2, 3], "數(shù)組鍵的值" ] , [ "name","余佳" ] , [ 0, [4, 5, 6] ] ]
var arrToMap = new Map(mapToArr)
arrToMap.has("name") //true
- map與對(duì)象之間的轉(zhuǎn)換。(僅限鍵為字符的map類型)
function strMapToObj (strMap){
let obj= Object.create(null);
for(let [k,v] of strMap){
obj[k] = v;
}
return obj;
}
function objToStrMap (obj){
var map = new Map();
for(let key in obj){
map.set(key,obj[key])
}
return map
}
var person = {name:'余佳', age: 25 ,};
var personMap = objToStrMap(person);
//Map(2) {"name" => "余佳", "age" => 25}
strMapToObj(personMap)
//{name: "余佳", age: 25}
總結(jié)
Map類型彌補(bǔ)了對(duì)象對(duì)key的限制(字符串),它接受任何類型作為它的key。Map類型和Set類型有著同樣的實(shí)例方法,set()、get()、delete()、has()、clear()等方法以及size、constructor屬性。map提供三個(gè)遍歷器函數(shù)keys()、values()、entries()和一個(gè)遍歷方法forEach()map可以在數(shù)組、對(duì)象、JSON等數(shù)據(jù)類型之間相互轉(zhuǎn)換。