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