介绍

这个对象是在 leetcode 刷题时遇到的,用作哈希表。

MDN 的描述是

Map 对象保存键值对,任何值都可以作为一个键或一个值

ObjectMaps 都允许存取键值,过去我们一直把对象当成 Maps 使用。不过

  • Map 的键更自由,可以是任意值,包括对象
  • 可以通过 size 属性直接获取一个 Map 键值对的个数,而 Object 的只能手算
  • Map 在频繁增删键值的场景性能更优
  • Map 可直接遍历,而 Object 不能直接遍历(需要先获取键数组)

使用

  • 新建 Map 对象

    var myMap = new Map()
  • 基本用法:存储与读取

    var keyObj = {}
    var keyString = "a string"
    
    // 存储
    myMap.set(keyObj, "keyObj 的值")
    myMap.set(keyString, "keyString的值")
    
    // 读取
    myMap.get(keyObj)
    myMap.get(keyString)
  • 使用 for ... of 方法遍历

    for(var [key, value] of myMap) {
        console.log(key, value)
    }
    
    for(var key of myMap.keys()) {
        console.log(key)
    }
    
    for(var value of myMap.values()) {
        console.log(value)
    }
  • 使用 forEach 方法遍历

    myMap.forEach((value, key) => {
        console.log(key, value)
    })
  • has 方法判断是否有某个键

    myMap.has(keyString)
  • Map 可以用数组创建,也可以还原成数组

    // 一个如下形式的二维数组,总与一个 map 一一对应
    var kvArray = [["key1", "value1"], ["key2", "value2"]]
    
    // 数组转 map
    var myMap = new Map(kvArray)
    
    // map 转数组
    console.log([...myMap])
    console.log(Array.from(myMap))
  • Map 可以复制(深拷贝)

    var map = new Map([['demoKey': 'demoValue']])
    
    var clone = new Map(map)
  • Map 可以合并

    var map1 = new Map([[1, 'one'], [2, 'two']])
    
    var map2 = new Map([[1, '一']])
    
    var merged = new Map([...map1, ...map2])
    
    console.log(merged.get(1)) // '一'
    console.log(merged.get(2)) // 'two'

参考

Map - JavaScript | MDN