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

Map

Js中的Object级解,本質(zhì)上是鍵值對的集合,但是只能夠用字符串作為key试伙,為解決這個問題嘁信,因此ES6中提供了Map數(shù)據(jù)結(jié)構(gòu)。

map類似于對象迁霎,也是鍵值對的集合吱抚,但是key不僅僅是字符串,各種類型的值(包括對象)都可以當(dāng)做建考廉。

Object 是“字符串—值”的對應(yīng)秘豹,Map 是“值—值”的對應(yīng),

const m = new Map();

const o = { p: 'hello world'};

m.set(o,'content')

m.get(o);//content

m.has(o)//true

m.delete(o)//true

m.has(o);//false

上面還用set方法將一個對象o作為m的一個鍵昌粤,然后又用get取到o的值然后刪除這個鍵

Map也可以接受一個數(shù)組作為參數(shù)既绕。該數(shù)組的成員是一個個表示鍵值對的數(shù)組

const map = new Map([

  ['name', '張三'],

  ['title', 'Author']

]);

map.size // 2

map.has('name') // true

map.get('name') // "張三"

map.has('title') // true

map.get('title') // "Author"

如果對同一個鍵多次賦值,后面的值將覆蓋前面的值涮坐。
如果讀取一個未知的鍵凄贩,則返回undefined。

只有對同一個對象的引用袱讹,Map結(jié)構(gòu)才將其視為同一個鍵疲扎。
var map = new Map();
//表面是針對同一個鍵昵时,但實際上這是兩個值,內(nèi)存地址是不一樣的
map.set(['a'], 555);
map.get(['a']) // undefined
同樣的值的兩個實例椒丧,在Map結(jié)構(gòu)中被視為兩個鍵
//變量k1和k2的值是一樣的壹甥,但是它們在Map結(jié)構(gòu)中被視為兩個鍵
var map = new Map(); 
var k1 = ['a'];
var k2 = ['a']; 
map
.set(k1, 111)
.set(k2, 222); 
map.get(k1) // 111
map.get(k2) // 222

由上可知,Map的鍵實際上是跟內(nèi)存地址綁定的壶熏,只要內(nèi)存地址不一樣句柠,就視為兩個鍵。這就解決了同名屬性碰撞的問題棒假。
map.size屬性返回Map結(jié)構(gòu)的成員總數(shù)
set(key, value)方法設(shè)置key
set方法返回的是Map本身溯职,因此可以采用鏈?zhǔn)綄懛ā?br> get方法讀取key對應(yīng)的鍵值,如果找不到key帽哑,返回undefined谜酒。
has方法返回一個布爾值,表示某個鍵是否在Map數(shù)據(jù)結(jié)構(gòu)中妻枕。
delete方法刪除某個鍵甚带,返回true。如果刪除失敗佳头,返回false鹰贵。
clear方法清除所有成員,沒有返回值康嘉。
Map原生提供三個遍歷器生成函數(shù)和一個遍歷方法碉输。

keys():返回鍵名的遍歷器。
values():返回鍵值的遍歷器亭珍。
entries():返回所有成員的遍歷器敷钾。
forEach():遍歷Map的所有成員。
需要特別注意的是肄梨,Map的遍歷順序就是插入順序阻荒。

Map結(jié)構(gòu)轉(zhuǎn)為數(shù)組結(jié)構(gòu),比較快速的方法是結(jié)合使用擴展運算符(...)众羡。

let map0 = new Map()
  .set(1, 'a')
  .set(2, 'b')
  .set(3, 'c');

let map1 = new Map(
  [...map0].filter(([k, v]) => k < 3)
);
// 產(chǎn)生Map結(jié)構(gòu) {1 => 'a', 2 => 'b'}

let map2 = new Map(
  [...map0].map(([k, v]) => [k * 2, '_' + v])
    );
// 產(chǎn)生Map結(jié)構(gòu) {2 => '_a', 4 => '_b', 6 => '_c'}

數(shù)組轉(zhuǎn)為Map

new Map([[true, 7], [{foo: 3}, ['abc']]])
// Map {true => 7, Object {foo: 3} => ['abc']}

Map轉(zhuǎn)為對象

//如果所有Map的鍵都是字符串侨赡,它可以轉(zhuǎn)為對象。
function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

let myMap = new Map().set('yes', true).set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }

Set

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末粱侣,一起剝皮案震驚了整個濱河市羊壹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌齐婴,老刑警劉巖油猫,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異柠偶,居然都是意外死亡情妖,警方通過查閱死者的電腦和手機睬关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毡证,“玉大人共螺,你說我怎么就攤上這事∏橹瘢” “怎么了?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵匀哄,是天一觀的道長秦效。 經(jīng)常有香客問我,道長涎嚼,這世上最難降的妖魔是什么阱州? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮法梯,結(jié)果婚禮上苔货,老公的妹妹穿的比我還像新娘。我一直安慰自己立哑,他們只是感情好夜惭,可當(dāng)我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铛绰,像睡著了一般诈茧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捂掰,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天敢会,我揣著相機與錄音,去河邊找鬼这嚣。 笑死鸥昏,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姐帚。 我是一名探鬼主播吏垮,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼罐旗!你這毒婦竟也來了惫皱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤尤莺,失蹤者是張志新(化名)和其女友劉穎旅敷,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颤霎,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡媳谁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年涂滴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晴音。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡柔纵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锤躁,到底是詐尸還是另有隱情搁料,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布系羞,位于F島的核電站郭计,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏椒振。R本人自食惡果不足惜昭伸,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澎迎。 院中可真熱鬧庐杨,春花似錦、人聲如沸夹供。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哮洽。三九已至各吨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間袁铐,已是汗流浹背揭蜒。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剔桨,地道東北人屉更。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像洒缀,于是被迫代替她去往敵國和親瑰谜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,585評論 2 359

推薦閱讀更多精彩內(nèi)容