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

set

ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set萍肆。它類似于數(shù)組,但是成員的值都是唯一的胀屿,沒有重復(fù)的值匾鸥。

Set 本身是一個構(gòu)造函數(shù),用來生成 Set 數(shù)據(jù)結(jié)構(gòu)碉纳。

//例
        const s = new Set();
        [2, 3, 5, 4, 5, 2, 2].forEach(x => s.add(x));
        for (let i of s) {
          console.log(i); //2,3,5,4
        }

//Set 函數(shù)可以接受一個數(shù)組(或類似數(shù)組的對象)作為參數(shù)勿负,用來初始化。

        const set = new Set([1, 2, 3, 4, 4]);

同時還可以利用set沒有重復(fù)的值這一特性, 實現(xiàn)數(shù)組去重.

var arr = [1,1,2,2,3,3];
var s = new Set(arr);
s.size;//3
console.log([...s]);//1,2,3;


//Array.form方法可以將 Set 結(jié)構(gòu)轉(zhuǎn)為數(shù)組劳曹。
const items = new Set([1, 2, 3, 4, 5]);
const arr = Array.from(items);

//另一種數(shù)array組去重的方法
function dedupe(array) {
  return Array.from(new Set(array));
}

dedupe([1, 1, 2, 3])

Set 結(jié)構(gòu)的實例有以下屬性奴愉。

  • Set.prototype.constructor:構(gòu)造函數(shù),默認(rèn)就是Set函數(shù)铁孵。
  • Set.prototype.size:返回Set實例的成員總數(shù)锭硼。

四個操作方法。

  • add(value):添加某個值蜕劝,返回Set結(jié)構(gòu)本身檀头。
  • delete(value):刪除某個值,返回一個布爾值岖沛,表示刪除是否成功暑始。
  • has(value):返回一個布爾值,表示該值是否為Set的成員婴削。
  • clear():清除所有成員廊镜,沒有返回值。

Set的遍歷

Set 結(jié)構(gòu)的實例有四個遍歷方法唉俗,可以用于遍歷成員嗤朴。

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

由于 Set 結(jié)構(gòu)沒有鍵名配椭,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致雹姊。
Set結(jié)構(gòu)的實例的forEach方法股缸,用于對每個成員執(zhí)行某種操作,沒有返回值吱雏。


Map

JavaScript 的對象(Object)敦姻,本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當(dāng)作鍵坎背。這給它的使用帶來了很大的限制替劈。

為了解決這個問題,ES6 提供了 Map 數(shù)據(jù)結(jié)構(gòu)得滤。它類似于對象陨献,也是鍵值對的集合,但是“鍵”的范圍不限于字符串懂更,各種類型的值(包括對象)都可以當(dāng)作鍵眨业。也就是說,Object 結(jié)構(gòu)提供了“字符串—值”的對應(yīng)沮协,Map結(jié)構(gòu)提供了“值—值”的對應(yīng)龄捡,是一種更完善的 Hash 結(jié)構(gòu)實現(xiàn)。如果你需要“鍵值對”的數(shù)據(jù)結(jié)構(gòu)慷暂,Map 比 Object 更合適

//例
var m = new Map([[{a:1}, 1], ["aa", 2]]);
console.log(m);
這里寫圖片描述

Map初始化方法

//Set和Map都可以用來生成新的 Map聘殖。

const set = new Set([
  ['foo', 1],
  ['bar', 2]
]);
const m1 = new Map(set);//set形式
const m2 = new Map([['baz', 3]]);//二維數(shù)組形式
const m3 = new Map(m2);//map形式


// 如果對同一個鍵多次賦值,后面的值將覆蓋前面的值行瑞。
const map = new Map();

map
.set(1, 'aaa')
.set(1, 'bbb');
console.log(map);//1=>bbb

Map屬性和操作方法

Map 結(jié)構(gòu)的實例有以下屬性和操作方法奸腺。

屬性/方法 作用
size屬性 size屬性返回 Map 結(jié)構(gòu)的成員總數(shù)。
set(key, value) set方法設(shè)置鍵名key對應(yīng)的鍵值為value血久,然后返回整個 Map 結(jié)構(gòu)突照。如果key已經(jīng)有值,則鍵值會被更新氧吐,否則就新生成該鍵讹蘑。set方法返回的是當(dāng)前的Map對象,因此可以采用鏈?zhǔn)綄懛ā?/td>
get(key) get方法讀取key對應(yīng)的鍵值筑舅,如果找不到key座慰,返回undefined。
has(key) has方法返回一個布爾值豁翎,表示某個鍵是否在當(dāng)前 Map 對象之中角骤。
delete(key) delete方法刪除某個鍵,返回true心剥。如果刪除失敗邦尊,返回false。
clear() clear方法清除所有成員优烧,沒有返回值蝉揍。

Map遍歷方法

遍歷方法
Map 結(jié)構(gòu)原生提供三個遍歷器生成函數(shù)和一個遍歷方法。

  • keys():返回鍵名的遍歷器畦娄。
  • values():返回鍵值的遍歷器又沾。
  • entries():返回所有成員的遍歷器。
  • forEach():遍歷 Map 的所有成員熙卡。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杖刷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子驳癌,更是在濱河造成了極大的恐慌滑燃,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颓鲜,死亡現(xiàn)場離奇詭異表窘,居然都是意外死亡,警方通過查閱死者的電腦和手機甜滨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門乐严,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衣摩,你說我怎么就攤上這事昂验。” “怎么了艾扮?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵既琴,是天一觀的道長。 經(jīng)常有香客問我栏渺,道長呛梆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任磕诊,我火速辦了婚禮填物,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘霎终。我一直安慰自己滞磺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布莱褒。 她就那樣靜靜地躺著击困,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阅茶,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天蛛枚,我揣著相機與錄音,去河邊找鬼脸哀。 笑死蹦浦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撞蜂。 我是一名探鬼主播盲镶,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝌诡!你這毒婦竟也來了溉贿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤浦旱,失蹤者是張志新(化名)和其女友劉穎宇色,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闽寡,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡代兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了爷狈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片植影。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖涎永,靈堂內(nèi)的尸體忽然破棺而出思币,到底是詐尸還是另有隱情,我是刑警寧澤羡微,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布谷饿,位于F島的核電站,受9級特大地震影響妈倔,放射性物質(zhì)發(fā)生泄漏博投。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一盯蝴、第九天 我趴在偏房一處隱蔽的房頂上張望毅哗。 院中可真熱鬧,春花似錦捧挺、人聲如沸虑绵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翅睛。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間捕发,已是汗流浹背疏旨。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爬骤,地道東北人充石。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓莫换,卻偏偏與公主長得像霞玄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拉岁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,697評論 2 351

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