ES6 Map數(shù)據(jù)結(jié)構(gòu)

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)做它的健。

  1. 對(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é)

  1. Map類型彌補(bǔ)了對(duì)象對(duì)key的限制(字符串),它接受任何類型作為它的key
  2. Map 類型和 Set 類型有著同樣的實(shí)例方法,set()、get()、delete()、has()、clear() 等方法以及 size、constructor屬性。
  3. map提供三個(gè)遍歷器函數(shù)keys()、values()、entries()和一個(gè)遍歷方法forEach()
  4. map可以在數(shù)組、對(duì)象、JSON等數(shù)據(jù)類型之間相互轉(zhuǎn)換。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容