js Map

1. 功能介绍

  Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值,当有重复的key和newValue插入时,会覆盖前面key对应的oldValue。

2. 基本使用

// 创建一个Map对象(当前举例无参数,可以用特定的二维数组、其它Map对象作为参数)
const map = new Map()

// key、value值可以是任意类型
map.set("key1", "value1")
map.set(NaN, "value2")
map.set({}, "value3")

// 通过key获取相应的value
map.get("key1") // "value1"
map.get(NaN) // "value2"
map.get({}) // undefined,因为此处的{} !== 前面的{}

// 查找Map对象是否具有某key
map.has("key1") // true
map.has("key4") // false

// 删除某key-value
map.delete("key1") // true 删除成功
map.delete("key4") // false 不存在key="key4"

// 使用for...of遍历
// for (let [key, value] of map) {
//     console.log(key, value)
// }

// 使用forEach方法遍历
map.forEach((value, key) => { //*****注意这里参数的顺序
        console.log(key, value)
})

3. 算法巩固 

3.1 两数之和 

3.1.1 题目描述

  给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

  你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

  来源:力扣(LeetCode)
  链接:https://leetcode-cn.com/problems/two-sum

3.1.2 示例

  给定 nums = [2, 7, 11, 15], target = 9

  因为 nums[0] + nums[1] = 2 + 7 = 9
  所以返回 [0, 1]

3.1.3 解决方案

  1. 暴力解决:通过双重循环遍历后续元素是否存在target-nums[i]的元素,此处不再赘述详细步骤。

  2. 使用Map对象:只循环一次,通过空间换取时间,每次遍历判断Map对象中是否存在当前遍历元素,如果没有找到,则将此次遍历的目标元素通过Map存储起来,思路有点绕,可以好好想一下:

/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = (nums, target) => {
    // 创建HashMap对象
    const map = new Map()

    for (let i = 0; i < nums.length; i++) {
        // 如果找到匹配的数,则返回
        if (map.has(nums[i])) {
            return [map.get(nums[i]), i]
        } else { // 如果没有找到,则将该位置对应需要找的数存储起来
            map.set(target - nums[i], i)
        }
    }
}

3.2 数组去重

3.2.1 题目描述

  数组中的元素不具备唯一性,往往会有相同的元素位于数组中不同位置的情况,现在需要设计一个算法,使数组中的数据唯一【不改变原数组的情况下,返回一个新数组】

3.2.2 示例  

  给定 nums = [2, 7, 11, 2, 15]

  因为数组下标为0的元素和数组下标为3的元素重复
  所以返回 [2, 7, 11, 15]

3.2.3 解决方案

  其它方案,例如封装方法、使用Set类等等方法暂时不讨论,在此处,我们主要讨论利用Map类如果添加相同的key和newValue会覆盖前面key对应oldValue的这一特点,以原数组元素作为Map对象添加数据的key,原数组元素对应的下标作为Map对象添加数据的value,实现数组去重:

const nums = [2, 7, 11, 2, 15]

// 创建一个Map对象用于数组去重
const map = new Map()

// 循环遍历nums,将数组元素和对应的下标添加到Map对象中
nums.forEach((value, index) => {
                map.set(value, index)
})

// 注意map.keys()虽然可以遍历(MapIterator),但不是数组
// 使用Array.from()方法将伪数组转换成数组
const noReptNums = Array.from(map.keys())

// 打印输出
console.log(noReptNums) // (4) [2, 7, 11, 15]

4. 参考文档

  https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Map

原文地址:https://www.cnblogs.com/haveadate/p/es6_map.html