set和map數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記

set

set類似于數(shù)組,但是沒有重復(fù)的值漫玄。

方法

  • Set.prototype.add(value):添加某個(gè)值睦优,返回 Set 結(jié)構(gòu)本身。

  • Set.prototype.delete(value):刪除某個(gè)值皱碘,返回一個(gè)布爾值隐孽,表示刪除是否成功家凯。

  • Set.prototype.has(value):返回一個(gè)布爾值绊诲,表示該值是否為Set的成員褪贵。

  • Set.prototype.clear():清除所有成員,沒有返回值世舰。

注意:set加入值的時(shí)候槽卫,不會(huì)發(fā)生類型轉(zhuǎn)換歼培。另外,加入NaN的時(shí)候查剖,認(rèn)為等于自身噪窘。兩個(gè)對(duì)象總是不相等的倔监。

遍歷操作

  • Set.prototype.keys():返回鍵名的遍歷器
  • Set.prototype.values():返回鍵值的遍歷器
  • Set.prototype.entries():返回鍵值對(duì)的遍歷器
  • Set.prototype.forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員

利用遍歷實(shí)現(xiàn)交集、并集和差集:

let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);

// 并集
let union = new Set([...a, ...b]);
// Set {1, 2, 3, 4}

// 交集
let intersect = new Set([...a].filter(x => b.has(x)));
// set {2, 3}

// 差集
let difference = new Set([...a].filter(x => !b.has(x)));
// Set {1}

在遍歷操作中同步改變set結(jié)構(gòu)有以下兩種方法:

// 方法一
let set = new Set([1, 2, 3]);
set = new Set([...set].map(val => val * 2));
// set的值是2, 4, 6

// 方法二
let set = new Set([1, 2, 3]);
set = new Set(Array.from(set, val => val * 2));
// set的值是2, 4, 6

WeakSet

weakset和set類似静暂,有兩個(gè)主要區(qū)別:

  • weakset的成員只能是對(duì)象

  • weakset中的對(duì)象是弱引用籍嘹,如果其他對(duì)象不引用該對(duì)象弯院,垃圾回收機(jī)制會(huì)自動(dòng)回收對(duì)象所占的內(nèi)存泪掀。因此异赫,weakset的成員不適用于引用头岔,也不可遍歷鼠证。

方法

  • WeakSet.prototype.add(value):向 WeakSet 實(shí)例添加一個(gè)新成員量九。
  • WeakSet.prototype.delete(value):清除 WeakSet 實(shí)例的指定成員。
  • WeakSet.prototype.has(value):返回一個(gè)布爾值类浪,表示某個(gè)值是否在 WeakSet 實(shí)例之中肌似。
const a = [[1, 2], [3, 4]];
const ws = new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}

注意:weakset可以接受一個(gè)數(shù)組或類似數(shù)組的對(duì)象作為參數(shù)川队,但是成為weakset成員的是數(shù)組的成員而不是數(shù)組本身,所以數(shù)組的成員只能是對(duì)象

weakset的一個(gè)用處是存儲(chǔ)DOM節(jié)點(diǎn)艳汽,不用擔(dān)心這些節(jié)點(diǎn)移除的時(shí)候會(huì)發(fā)生內(nèi)存泄漏对雪。

Map

作用:解決了對(duì)象只能用字符串作為鍵值的問題

用法:Map可接受一個(gè)數(shù)組作為參數(shù)瑟捣,數(shù)組中的元素是一個(gè)表示鍵值對(duì)的數(shù)組。

注意:Map的鍵實(shí)際上是與內(nèi)存地址綁定的捐祠,內(nèi)存地址不一樣的兩個(gè)值就視為兩個(gè)鍵踱蛀。如果兩個(gè)值嚴(yán)格相等就視為一個(gè)鍵

屬性和方法

  • size屬性

    size屬性返回map結(jié)構(gòu)的成員總數(shù)

  • Map.prototype.set(key, value)

    set方法返回當(dāng)前map對(duì)象贵白。設(shè)置方法如下:

    const m = new Map();
    
    m.set('edition', 6)        // 鍵是字符串
    m.set(262, 'standard')     // 鍵是數(shù)值
    m.set(undefined, 'nah')    // 鍵是 undefined
    
    

    可以更改value的值禁荒,為key重新賦值

    另外,可以采取鏈?zhǔn)綄懛?/p>

    let map = new Map()
      .set(1, 'a')
      .set(2, 'b')
      .set(3, 'c');
    
    
  • Map.prototype.get(key)

    該方法用于讀取key對(duì)應(yīng)的鍵值勃痴,如果找不到key,則返回undefined

  • Map.prototype.has(key)

    用于判斷一個(gè)key是否在map對(duì)象中劣领,返回一個(gè)布爾值

  • Map.prototype.delete(key)

    用于刪除一個(gè)鍵铁材,成功返回true

  • Map.prototype.clear()

    用于清除所有成員

遍歷方法

  • Map.prototype.keys():返回鍵名的遍歷器衫贬。
  • Map.prototype.values():返回鍵值的遍歷器。
  • Map.prototype.entries():返回所有成員的遍歷器梆造。
  • Map.prototype.forEach():遍歷 Map 的所有成員镇辉。

用法如下:

for (let key of map.keys()) {
  console.log(key);
}

for (let value of map.values()) {
  console.log(value);
}

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}

除此之外贴捡,還可以用數(shù)組的map方法、foreach方法和filter方法屹逛,可以實(shí)現(xiàn)map的遍歷和過濾汛骂,用法如下:

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

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

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

與其他數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換

  • Map轉(zhuǎn)成數(shù)組

    最簡(jiǎn)便的方法就是使用擴(kuò)展運(yùn)算符...

  • 數(shù)組轉(zhuǎn)成Map

    將數(shù)組傳入構(gòu)造函數(shù)就可以實(shí)現(xiàn):

    new Map([
      [true, 7],
      [{foo: 3}, ['abc']]
    ])
    
    
  • Map轉(zhuǎn)成對(duì)象

    function strMapToObj(strMap) {
      let obj = Object.create(null);
      for (let [k,v] of strMap) {
        obj[k] = v;
      }
      return obj;
    }
    
    const myMap = new Map()
      .set('yes', true)
      .set('no', false);
    strMapToObj(myMap)
    // { yes: true, no: false }
    
    

    直接遍歷再將鍵值插入對(duì)象中就好了淑掌。

    如果鍵不是字符串蝶念,會(huì)將鍵名轉(zhuǎn)換成字符串,再作為對(duì)象鍵名担敌。

  • 對(duì)象轉(zhuǎn)成Map

    遍歷對(duì)象中的元素柄错,再用set方法加入map中

  • Map轉(zhuǎn)成JSON

    • 鍵名都是字符串苦酱,可以先將Map轉(zhuǎn)成對(duì)象,再轉(zhuǎn)成JSON格式

    • 鍵名有非字符串疫萤,可以轉(zhuǎn)成數(shù)組JSON

      function mapToArrayJson(map) {
        return JSON.stringify([...map]);
      }
      
      let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']);
      mapToArrayJson(myMap)
      // '[[true,7],[{"foo":3},["abc"]]]'
      
      
  • JSON轉(zhuǎn)成Map

    • 先轉(zhuǎn)成對(duì)象再轉(zhuǎn)成JSON

    • 如果JSON是一個(gè)數(shù)組,且每個(gè)數(shù)組成員本身,又是一個(gè)有兩個(gè)成員的數(shù)組遇骑。這時(shí)棉浸,它可以一一對(duì)應(yīng)地轉(zhuǎn)為 Map。這往往是 Map 轉(zhuǎn)為數(shù)組 JSON 的逆操作尾序。

      function jsonToMap(jsonStr) {
        return new Map(JSON.parse(jsonStr));
      }
      
      jsonToMap('[[true,7],[{"foo":3},["abc"]]]')
      // Map {true => 7, Object {foo: 3} => ['abc']}
      
      

WeakMap

與Map的區(qū)別:

  • WeakMap只接受對(duì)象作為鍵名(null除外)

  • WeakMap的鍵名所指向的對(duì)象钓丰,不計(jì)入垃圾回收機(jī)制

語法:

  • 與Map相比沒有遍歷操作,沒有size屬性
  • 四個(gè)方法:
    • set()
    • get()
    • has()
    • delete()

參考資料

ECMAScript 6 入門

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末每币,一起剝皮案震驚了整個(gè)濱河市携丁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兰怠,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揭保,死亡現(xiàn)場(chǎng)離奇詭異肥橙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秸侣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門存筏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人味榛,你說我怎么就攤上這事方篮。” “怎么了励负?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵藕溅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我继榆,道長(zhǎng)巾表,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任略吨,我火速辦了婚禮集币,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翠忠。我一直安慰自己鞠苟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著当娱,像睡著了一般吃既。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跨细,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天鹦倚,我揣著相機(jī)與錄音,去河邊找鬼冀惭。 笑死震叙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的散休。 我是一名探鬼主播媒楼,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼戚丸!你這毒婦竟也來了匣砖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤昏滴,失蹤者是張志新(化名)和其女友劉穎猴鲫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谣殊,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拂共,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姻几。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宜狐。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛇捌,靈堂內(nèi)的尸體忽然破棺而出抚恒,到底是詐尸還是另有隱情,我是刑警寧澤络拌,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布俭驮,位于F島的核電站,受9級(jí)特大地震影響春贸,放射性物質(zhì)發(fā)生泄漏混萝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一萍恕、第九天 我趴在偏房一處隱蔽的房頂上張望逸嘀。 院中可真熱鬧,春花似錦允粤、人聲如沸崭倘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽司光。三九已至琅坡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間飘庄,已是汗流浹背脑蠕。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工购撼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留跪削,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓迂求,卻偏偏與公主長(zhǎng)得像碾盐,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子揩局,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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