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

1,set

基本用法
ES6 提供了新的數(shù)據(jù)結(jié)構(gòu) Set趣苏。它類似于數(shù)組狡相,但是成員的值都是唯一的,沒有重復(fù)的值食磕。
Set 本身是一個(gè)構(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

上面代碼通過add方法向 Set 結(jié)構(gòu)加入成員滔悉,結(jié)果表明 Set 結(jié)構(gòu)不會(huì)添加重復(fù)的值。
實(shí)現(xiàn)數(shù)組去重

// 去除數(shù)組的重復(fù)成員
[...new Set(array)]
Set 實(shí)例的屬性和方法 § ?

Set 結(jié)構(gòu)的實(shí)例有以下屬性单绑。

  • Set.prototype.constructor:構(gòu)造函數(shù)回官,默認(rèn)就是Set函數(shù)。
  • Set.prototype.size:返回Set實(shí)例的成員總數(shù)询张。
    Set 實(shí)例的方法分為兩大類:操作方法(用于操作數(shù)據(jù))和遍歷方法(用于遍歷成員)孙乖。下面先介紹四個(gè)操作方法。
  • add(value):添加某個(gè)值份氧,返回 Set 結(jié)構(gòu)本身唯袄。
  • delete(value):刪除某個(gè)值,返回一個(gè)布爾值蜗帜,表示刪除是否成功恋拷。
  • has(value):返回一個(gè)布爾值,表示該值是否為Set的成員厅缺。
  • clear():清除所有成員蔬顾,沒有返回值宴偿。

Array.from方法 可以將 Set 結(jié)構(gòu)轉(zhuǎn)為數(shù)組。

const items = new Set([1, 2, 3, 4, 5]);
const array = Array.from(items);

這就提供了去除數(shù)組重復(fù)成員的另一種方法诀豁。

function dedupe(array) {
  return Array.from(new Set(array));
}
dedupe([1, 1, 2, 3]) // [1, 2, 3]

遍歷操作

Set 結(jié)構(gòu)的實(shí)例有四個(gè)遍歷方法窄刘,可以用于遍歷成員。

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

2舷胜,Map

含義和基本用法

JavaScript 的對象(Object)娩践,本質(zhì)上是鍵值對的集合(Hash 結(jié)構(gòu)),但是傳統(tǒng)上只能用字符串當(dāng)作鍵烹骨。這給它的使用帶來了很大的限制翻伺。
也就是說object的鍵名只能是字符串,而Map的鍵名可以為任意類型

Map的屬性和操作方法

Map 結(jié)構(gòu)的實(shí)例有以下屬性和操作方法沮焕。
(1)size 屬性
size屬性返回 Map 結(jié)構(gòu)的成員總數(shù)吨岭。

const map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 2

(2)set(key, value)
set方法設(shè)置鍵名key對應(yīng)的鍵值為value,然后返回整個(gè) Map 結(jié)構(gòu)峦树。如果key已經(jīng)有值辣辫,則鍵值會(huì)被更新,否則就新生成該鍵空入。

const m = new Map();

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

(3)get(key)
get方法讀取key對應(yīng)的鍵值络它,如果找不到key,返回undefined歪赢。

const m = new Map();

const hello = function() {console.log('hello');};
m.set(hello, 'Hello ES6!') // 鍵是函數(shù)

m.get(hello)  // Hello ES6!

(4)has(key)
has方法返回一個(gè)布爾值化戳,表示某個(gè)鍵是否在當(dāng)前 Map 對象之中。

const m = new Map();

m.set('edition', 6);
m.set(262, 'standard');
m.set(undefined, 'nah');

m.has('edition')     // true
m.has('years')       // false
m.has(262)           // true
m.has(undefined)     // true

(5)delete(key)
delete方法刪除某個(gè)鍵埋凯,返回true点楼。如果刪除失敗,返回false白对。

const m = new Map();
m.set(undefined, 'nah');
m.has(undefined)     // true

m.delete(undefined)
m.has(undefined)       // false

(6)clear()
clear方法清除所有成員掠廓,沒有返回值。

let map = new Map();
map.set('foo', true);
map.set('bar', false);

map.size // 2
map.clear()
map.size // 0

遍歷方法

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

keys():返回鍵名的遍歷器蟀瞧。
values():返回鍵值的遍歷器。
entries():返回所有成員的遍歷器条摸。
forEach():遍歷 Map 的所有成員悦污。

需要特別注意的是,Map 的遍歷順序就是插入順序钉蒲。

const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

// 等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末切端,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子顷啼,更是在濱河造成了極大的恐慌踏枣,老刑警劉巖昌屉,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茵瀑,居然都是意外死亡间驮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門瘾婿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜻牢,“玉大人,你說我怎么就攤上這事偏陪。” “怎么了煮嫌?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵笛谦,是天一觀的道長。 經(jīng)常有香客問我昌阿,道長饥脑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任懦冰,我火速辦了婚禮灶轰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘刷钢。我一直安慰自己笋颤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布内地。 她就那樣靜靜地躺著伴澄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阱缓。 梳的紋絲不亂的頭發(fā)上非凌,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機(jī)與錄音荆针,去河邊找鬼敞嗡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛航背,可吹牛的內(nèi)容都是我干的喉悴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沃粗,長吁一口氣:“原來是場噩夢啊……” “哼粥惧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起最盅,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤突雪,失蹤者是張志新(化名)和其女友劉穎起惕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體咏删,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惹想,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了督函。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘀粱。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辰狡,靈堂內(nèi)的尸體忽然破棺而出锋叨,到底是詐尸還是另有隱情,我是刑警寧澤宛篇,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布娃磺,位于F島的核電站,受9級特大地震影響叫倍,放射性物質(zhì)發(fā)生泄漏偷卧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一吆倦、第九天 我趴在偏房一處隱蔽的房頂上張望听诸。 院中可真熱鬧,春花似錦蚕泽、人聲如沸晌梨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽派任。三九已至,卻和暖如春璧南,著一層夾襖步出監(jiān)牢的瞬間掌逛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工司倚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豆混,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓动知,卻偏偏與公主長得像皿伺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子盒粮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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