JavaScript ES6 Map 对象

  • 方法

set()、get()、delete()、has()、clear()、size

set,get 键值对

key 是字符串

1const myMap = new Map()
2myMap.set('键', '和键关联的值') // 设置 键值对
3myMap.get('键') // "和键关联的值" 获取值

key 是对象

1const myMap = new Map()
2const keyObj = {}
3myMap.set(keyObj, '和键 keyObj 关联的值')
4myMap.get(keyObj) // "和键 keyObj 关联的值"
5myMap.get({}) // undefined, 因为 keyObj !== {}

key 是函数时也与 key 是对象同理。

key 是 NaN ,NaN 作为 Map 的键没有区别。

1const myMap = new Map()
2myMap.set(Number.NaN, 'not a number')
3myMap.get(Number.NaN) // "not a number"
4myMap.get(Number('无法转换')) // "not a number"

Map 的迭代 遍历

1const myMap = new Map()
2myMap.set(0, 'zero')
3myMap.set(1, 'one')

for...of

1for (var [key, value] of myMap)
2  console.log(`${key} = ${value}`)
3
4/* 打印两次
5  "0 = zero"
6  "1 = one"
7*/
8
9myMap.entries() // MapIterator {0 => "zero", 1 => "one"}
10for (var [key, value] of myMap.entries())
11  console.log(`${key} = ${value}`)
12
13// entries() 方法返回 Iterator 对象,它按set插入键值对顺序包含 Map 对象中每个元素的 [key, value] 数组。
14
15myMap.keys() // MapIterator {0, 1} 返回键
16for (var key of myMap.keys())
17  console.log(key) // 打印 0 和 1
18
19// keys()返回 Iterator 对象,按插入顺序包含 Map 对象每个元素的键
20
21myMap.values() // MapIterator {"zero", "one"}
22for (var value of myMap.values())
23  console.log(value) // 一个是 "zero" 另一个是 "one"
24
25/* values() 返回 Iterator 对象,按插入顺序包含 Map 对象每个元素的值。 */

forEach

1myMap.forEach(function(value, key) {
2 console.log(key + " = " + value);
3 // 一个是 "0 = zero" 另一个是 "1 = one"
4}

对象操作

转换

1const kvArray = [
2  ['key1', 'value1'],
3  ['key2', 'value2'],
4]
5// 可以将 二维 键值对数组转换 Map 对象
6
7const myMap = new Map(kvArray) // {"key1" => "value1", "key2" => "value2"}
8// Array.from 函数将 Map 对象转回去
9
10const outArray = Array.from(myMap) // [["key1", "value1"], ["key2", "value2"]]

克隆

1const myMap1 = new Map([
2  ['key1', 'value1'],
3  ['key2', 'value2'],
4])
5const myMap2 = new Map(myMap1)
6/* {"key1" => "value1", "key2" => "value2"} */
7
8console.log(myMap1 === myMap2) // false 新地址

合并

1const first = new Map([
2  [1, 'one'],
3  [2, 'two'],
4  [3, 'three'],
5])
6const second = new Map([
7  [1, 'uno'],
8  [2, 'dos'],
9])
10// 合并两个 Map 对象时,有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three
11
12const merged = new Map([...first, ...second]) // 解构传参
13console.log(merged) // {1 => "uno", 2 => "dos", 3 => "three"}