Map對(duì)象
Map 對(duì)象保存鍵值對(duì)缴挖。任何值(對(duì)象或者原始值) 都可以作為一個(gè)鍵或一個(gè)值芥被。
Maps 和 Objects 的區(qū)別
- 一個(gè) Object 的鍵只能是字符串或者 Symbols,但一個(gè)Map 的鍵可以是任意值坚冀。
- Map 中的鍵值是有序的(FIFO 原則)抄谐,而添加到對(duì)象中的鍵則不是。
- Map 的鍵值對(duì)個(gè)數(shù)可以從 size 屬性獲取撵幽,而 Object 的鍵值對(duì)個(gè)數(shù)只能手動(dòng)計(jì)算。
- Object 都有自己的原型礁击,原型鏈上的鍵名有可能和你自己在對(duì)象上的設(shè)置的鍵名產(chǎn)生沖突。
Map對(duì)象的屬性
size:返回Map對(duì)象中所包含的鍵值對(duì)個(gè)數(shù)逗载。
Map對(duì)象的方法
- set(key, val): 向Map中添加新元素哆窿;
- get(key): 通過(guò)鍵值查找特定的數(shù)值并返回;
- has(key): 判斷Map對(duì)象中是否有Key所對(duì)應(yīng)的值厉斟,有返回true,否則返回false挚躯;
- delete(key): 通過(guò)鍵值從Map中移除對(duì)應(yīng)的數(shù)據(jù);
- clear(): 將這個(gè)Map中的所有元素刪除擦秽。
const m1 = new Map([['a',222],['b',888]]);
console.log(m1); //{"a" => 222, "b" => 888}
console.log(m1.get('a')); //222
const m2 = new Map([['c',777]]);
const m3 = new Map(m2);
console.log(m3.get('c')); //777
console.log(m3.has('a')); //false
console.log(m3.set('d',111)); {"c" => 777, "d" => 111}
遍歷方法
keys():返回鍵名的遍歷器
values():返回鍵值的遍歷器
entries():返回鍵值對(duì)的遍歷器
forEach():使用回調(diào)函數(shù)遍歷每個(gè)成員
Map與其他數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換
Map轉(zhuǎn)換為數(shù)組和對(duì)象
const arr = [[{'a': 1}, 111], ['b': 222]]
const myMap = new Map(arr)
[...myMap] // map轉(zhuǎn)數(shù)組码荔。 [[{'a': 1}, 111], ['b': 222]]
const obj = {}
const map = new Map(['a', 111], ['b', 222])
for(let [key,value] of map) {
obj[key] = value
}
console.log(obj) // {a:111, b: 222}
Set 對(duì)象
Set 對(duì)象允許你存儲(chǔ)任何類型的唯一值漩勤,無(wú)論是原始值或者是對(duì)象引用。
Set 中的特殊值
Set 對(duì)象存儲(chǔ)的值總是唯一的缩搅,所以需要判斷兩個(gè)值是否恒等越败。有幾個(gè)特殊值需要特殊對(duì)待:
- +0 與 -0 在存儲(chǔ)判斷唯一性的時(shí)候是恒等的,所以不重復(fù)硼瓣;
- undefined 與 undefined 是恒等的究飞,所以不重復(fù);
- NaN 與 NaN 是不恒等的堂鲤,但是在 Set 中只能存一個(gè)亿傅,不重復(fù)。
Set 對(duì)象作用
數(shù)組去重(利用擴(kuò)展運(yùn)算符)
const mySet = new Set([1, 2, 3, 4, 4])
[...mySet] // [1, 2, 3, 4]
并集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var union = new Set([...a, ...b]); // {1, 2, 3, 4}
交集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var intersect = new Set([...a].filter(x => b.has(x))); // {2, 3}
差集
var a = new Set([1, 2, 3]);
var b = new Set([4, 3, 2]);
var difference = new Set([...a].filter(x => !b.has(x))); // {1}
注:x => b.has(x) 本質(zhì)是一個(gè)函數(shù)相當(dāng)于 function(x){return b.has(x)}瘟栖。
Set實(shí)例對(duì)象的方法
add(value):添加某個(gè)值葵擎,返回 Set 結(jié)構(gòu)本身(可以鏈?zhǔn)秸{(diào)用)。
delete(value):刪除某個(gè)值半哟,刪除成功返回true坪蚁,否則返回false。
has(value):返回一個(gè)布爾值镜沽,表示該值是否為Set的成員敏晤。
clear():清除所有成員,沒(méi)有返回值缅茉。
Map和Set區(qū)別
區(qū)別:
1.Map是鍵值對(duì)嘴脾,Set是值的集合,當(dāng)然鍵和值可以是任何的值蔬墩;
2.Map可以通過(guò)get方法獲取值译打,而set不能,因?yàn)樗挥兄担?br>
3.都能通過(guò)迭代器進(jìn)行for...of遍歷拇颅;
4.Set的值是唯一的可以做數(shù)組去重奏司,Map由于沒(méi)有格式限制,可以做數(shù)據(jù)存儲(chǔ)樟插;
5.map和set都是stl中的關(guān)聯(lián)容器韵洋,map以鍵值對(duì)的形式存儲(chǔ),key=value組成pair黄锤,是一組映射關(guān)系搪缨。set只有值,可以認(rèn)為只有一個(gè)數(shù)據(jù)鸵熟,并且set中元素不可以重復(fù)且自動(dòng)排序副编。