/

JavaScript 地圖資料結構

JavaScript 地圖資料結構

在 JavaScript 中,使用地圖資料結構可以將資料與鍵值關聯起來。在 ES6 引入地圖資料結構之前,人們通常將物件用作地圖,將某個物件或值與特定的鍵值關聯起來。

什麼是地圖

地圖資料結構允許將資料與鍵值關聯起來。

ES6 之前

ECMAScript 6(也稱為 ES2015)引入了地圖資料結構到 JavaScript 世界中,以及集合

在 ES6 之前,人們通常使用物件作為地圖,通過將某個物件或值與特定的鍵值關聯起來:

1
2
3
4
5
6
7
const car = {}
car['color'] = 'red'
car.owner = 'Flavio'
console.log(car['color']) // red
console.log(car.color) // red
console.log(car.owner) // Flavio
console.log(car['owner']) // Flavio

進入地圖

ES6 引入了地圖資料結構,為我們提供了一個適當的工具來處理這種類型的資料組織。

可以通過調用以下方法來初始化地圖:

1
const m = new Map()

將項目添加到地圖中

可以使用 set 方法將項目添加到地圖中:

1
2
m.set('color', 'red')
m.set('age', 2)

按鍵從地圖中獲取項目

可以使用 get 方法從地圖中獲取項目:

1
2
const color = m.get('color')
const age = m.get('age')

按鍵從地圖中刪除項目

使用 delete() 方法:

1
m.delete('color')

從地圖中刪除所有項目

使用 clear() 方法:

1
m.clear()

檢查地圖中是否包含特定鍵的項目

使用 has() 方法:

1
const hasColor = m.has('color')

查找地圖中項目的數量

使用 size 屬性:

1
const size = m.size

初始化具有值的地圖

可以使用一組值來初始化地圖:

1
const m = new Map([['color', 'red'], ['owner', 'Flavio'], ['age', 2]])

地圖的鍵

與地圖的鍵-值項目一樣,任何值(物件、陣列、字串、數字)都可以用作鍵,即使是物件也可以。

如果使用 get() 從地圖中取出一個不存在的鍵,它將返回 undefined

你幾乎永遠不會在真實生活中遇到的奇怪情況

1
2
3
const m = new Map()
m.set(NaN, 'test')
m.get(NaN) // test
1
2
3
const m = new Map()
m.set(+0, 'test')
m.get(-0) // test

遍歷地圖

遍歷地圖的鍵

地圖提供了 keys() 方法,我們可以使用它來遍歷所有的鍵:

1
2
3
for (const k of m.keys()) {
console.log(k)
}

遍歷地圖的值

地圖對象提供了 values() 方法,我們可以使用它來遍歷所有的值:

1
2
3
for (const v of m.values()) {
console.log(v)
}

遍歷地圖的鍵和值對

地圖對象提供了 entries() 方法,我們可以使用它來遍歷所有的鍵和值對:

1
2
3
for (const [k, v] of m.entries()) {
console.log(k, v)
}

這可以簡化為:

1
2
3
for (const [k, v] of m) {
console.log(k, v)
}

轉換為陣列

將地圖的鍵轉換為陣列

1
const a = [...m.keys()]

將地圖的值轉換為陣列

1
const a = [...m.values()]

WeakMap

WeakMap 是特殊類型的地圖。

在地圖對象中,項目永遠不會被回收。但是 WeakMap 允許其所有項目自由地被垃圾回收。WeakMap 的每個鍵都是一個物件。當該物件的引用丟失時,對應的值將被垃圾回收。

以下是主要的區別:

  1. 不能遍歷一個 WeakMap 的鍵或值(或鍵-值)
  2. 不能從 WeakMap 中清除所有項目
  3. 不能檢查其大小

WeakMap 提供了以下方法,它們與地圖的方法等效:

  • get(k)
  • set(k, v)
  • has(k)
  • delete(k)

使用 WeakMap 的用例不如使用 Map 的用例明確,你可能永遠不會需要使用 WeakMap,但它可以用於構建一個對垃圾回收不會產生干擾的內存敏感型緩存,或用於保密和信息隱藏。

tags: [“JavaScript”, “Data Structure”]