Map 對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。構造函數 可以接受一個數組作為參數。 Map和Object的區別 一個 的鍵只能是字元串或者 ,但一個 的鍵可以是任意值。 中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是。 的鍵值對個數可以從 size 屬性獲 ...
Map
Map
對象保存鍵值對。任何值(對象或者原始值) 都可以作為一個鍵或一個值。構造函數Map
可以接受一個數組作為參數。
Map和Object的區別
一個
Object
的鍵只能是字元串或者Symbols
,但一個Map
的鍵可以是任意值。Map
中的鍵值是有序的(FIFO 原則),而添加到對象中的鍵則不是。Map
的鍵值對個數可以從 size 屬性獲取,而Object
的鍵值對個數只能手動計算。Object
都有自己的原型,原型鏈上的鍵名有可能和你自己在對象上的設置的鍵名產生衝突。
- Map對象的屬性
- size:返回Map對象中所包含的鍵值對個數
- Map對象的方法
set(key, val): 向Map中添加新元素
get(key): 通過鍵值查找特定的數值並返回
has(key): 判斷Map對象中是否有Key所對應的值,有返回true,否則返回false
delete(key): 通過鍵值從Map中移除對應的數據
clear(): 將這個Map中的所有元素刪除
const m1 = new Map([['a', 111], ['b', 222]])
console.log(m1) // {"a" => 111, "b" => 222}
m1.get('a') // 111
const m2 = new Map([['c', 3]])
const m3 = new Map(m2)
m3.get('c') // 3
m3.has('c') // true
m3.set('d', 555)
m3.get('d') // 555
- 遍歷方法
keys()
:返回鍵名的遍歷器values()
:返回鍵值的遍歷器entries()
:返回鍵值對的遍歷器forEach()
:使用回調函數遍歷每個成員
const map = new Map([['a', 1], ['b', 2]])
for (let key of map.keys()) {
console.log(key)
}
// "a"
// "b"
for (let value of map.values()) {
console.log(value)
}
// 1
// 2
for (let item of map.entries()) {
console.log(item)
}
// ["a", 1]
// ["b", 2]
// 或者
for (let [key, value] of map.entries()) {
console.log(key, value)
}
// "a" 1
// "b" 2
// for...of...遍歷map等同於使用map.entries()
for (let [key, value] of map) {
console.log(key, value)
}
// "a" 1
// "b" 2
- map與其他數據結構的互相轉換
- map轉換為數組(使用擴展運算符)
const arr = [[{'a': 1}, 111], ['b': 222]]
const myMap = new Map(arr)
[...myMap] // map轉數組。 [[{'a': 1}, 111], ['b': 222]]
Map
與對象的互換
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}
JSON
字元串要轉換成Map
可以先利用JSON.parse()轉換成數組或者對象,然後再轉換即可。
Set
Set
對象允許你存儲任何類型的值,無論是原始值或者是對象引用。它類似於數組,但是成員的值都是唯一的,沒有重覆的值。
Set
本身是一個構造函數,用來生成Set
數據結構。Set
函數可以接受一個數組(或者具有 iterable 介面的其他數據結構)作為參數,用來初始化。
Set中的特殊值
Set
對象存儲的值總是唯一的,所以需要判斷兩個值是否恆等。有幾個特殊值需要特殊對待:
+0 與 -0 在存儲判斷唯一性的時候是恆等的,所以不重覆
undefined 與 undefined 是恆等的,所以不重覆
NaN 與 NaN 是不恆等的,但是在 Set 中認為NaN與NaN相等,所有隻能存在一個,不重覆。
- Set實例對象的屬性
- size:返回Set實例的成員總數。
- Set實例對象的方法
add(value)
:添加某個值,返回 Set 結構本身(可以鏈式調用)。delete(value)
:刪除某個值,刪除成功返回true
,否則返回false
。has(value)
:返回一個布爾值,表示該值是否為Set的成員。clear()
:清除所有成員,沒有返回值。
const mySet = new Set(['a', 'a', 'b', 1, 2, 1])
console.log(mySet) // {'a', 'b', 1, 2}
myset.add('c').add({'a': 1})
console.log(mySet) // {'a', 'b', 1, 2, 'c', {a: 1}}
console.log(mySet.size) // 6
mySet.has(2) // true
- 遍歷方法
keys()
:返回鍵名的遍歷器。values()
:返回鍵值的遍歷器。entries()
:返回鍵值對的遍歷器。forEach()
:使用回調函數遍歷每個成員。
由於Set
結構沒有鍵名,只有鍵值(或者說鍵名和鍵值是同一個值),所以keys方法和values方法的行為完全一致。
const set = new Set(['a', 'b', 'c'])
for (let item of set.keys()) {
console.log(item)
}
// a
// b
// c
for (let item of set.values()) {
console.log(item)
}
// a
// b
// c
for (let item of set.entries()) {
console.log(item)
}
// ["a", "a"]
// ["b", "b"]
// ["c", "c"]
// 直接遍歷set實例,等同於遍歷set實例的values方法
for (let i of set) {
console.log(i)
}
// a
// b
// c
set.forEach((value, key) => console.log(key + ' : ' + value))
// a: a
// b: b
// c: c
- Set 對象作用
- 數組去重(利用擴展運算符)
const mySet = new Set([1, 2, 3, 4, 4])
[...mySet] // [1, 2, 3, 4]
- 合併兩個set對象
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let union = new Set([...a, ...b]) // {1, 2, 3, 4}
- 交集
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let intersect = new Set([...a].filter(x => b.has(x))) // {2, 3} 利用數組的filter方法
- 差集
let a = new Set([1, 2, 3])
let b = new Set([4, 3, 2])
let difference = new Set([...a].filter(x => !b.has(x))) // {1}