zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    栈大小和内存分部问题
    inline和宏之间的区别
    两个栈实现双端队列
    Hibernate学习笔记-Hibernate关系映射
    Hibernate学习笔记-Hibernate HQL查询
    Hibernate学习笔记--第一个Hibernate框架程序
    Hibernate学习笔记--Hibernate框架错误集合及解决
    Java学习笔记--对象克隆
    Scala学习笔记--文件IO
    Java学习笔记--Socket和ServerSocket
  • 原文地址:https://www.cnblogs.com/haveadate/p/es6_map.html
Copyright © 2011-2022 走看看