• ES6:Map


    Map对象

    1、Map 对象

    Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

    2、Maps 和 Objects 的区别

    • 一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
    • Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
    • Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
    • Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。

    3、Map 中的 key

    (1)key 是字符串

    var myMap=new Map();
    var kk='a string';
    myMap.set(kk,"for a thing");
    console.log(myMap.get(kk))//for a thing
    console.log(myMap.get("a string"))//for a thing
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (2)key 是对象

    var myMap=new Map();
    var keyObj = {}
    myMap.set(keyObj,"for a thing");
    console.log(myMap.get(keyObj))//for a thing
    console.log(myMap.get({}))//undefined
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (3)key 是函数

    var myMap=new Map();
    var keyFunc=function () {}
    myMap.set(keyFunc,"for a thing");
    console.log(myMap.get(keyFunc))//for a thing
    console.log(myMap.get(function(){}))//undefined
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (4)key 是 NaN

    var myMap=new Map();
    myMap.set(NaN,"for a thing");
    console.log(myMap.get(NaN))//for a thing
    
    var otherNaN=Number("you")
    console.log(myMap.get(otherNaN))//for a thing
    
    var myMap=new Map();
    myMap.set(NaN,"for a thing");
    console.log(myMap.get(NaN))//for a thing
    
    var otherNaN=Number(2,4)
    console.log(myMap.get(otherNaN))//undefined
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    4、Map 的迭代

    var myMap=new Map();
    myMap.set(0,"def")
    myMap.set(1,"rfg")myMap.set(3,"ppp")
    
    for(var [index,value] of myMap){    
    	console.log(index+"="+value)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    var myMap=new Map();
    myMap.set(0,"def")
    myMap.set(1,"rfg")myMap.set(3,"ppp")
    
    for(var [index,value] of myMap.entries()){
        	console.log(index+"="+value)
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这个 entries 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的 [index, value] 数组。
    在这里插入图片描述

    var myMap=new Map();
    myMap.set(0,"def")
    myMap.set(1,"rfg")
    myMap.set(3,"ppp")
    
    for (var key of myMap.keys()) {  
     console.log(key);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这个 keys 方法返回一个新的 Iterator 对象, 它按插入顺序包含了 Map 对象中每个元素的键。
    在这里插入图片描述

    var myMap=new Map();
    myMap.set(0,"def")
    myMap.set(1,"rfg")
    myMap.set(3,"ppp")
    
    for (var value of myMap.values()) {
      console.log(value);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这个 values 方法返回一个新的 Iterator 对象,它按插入顺序包含了 Map 对象中每个元素的值。
    在这里插入图片描述

    var myMap=new Map();
    myMap.set(0,"def")
    myMap.set(1,"rfg")
    myMap.set(3,"ppp")
    myMap.forEach(function(value,key){
        console.log(key+"="+value);
    },myMap);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    5、Map 对象的操作

    (1)Map 与 Array的转换

    var k=[["one","thr"],["two","yht"]]
    var myMap=new Map(k);
    var arr=Array.from(myMap)
    console.log(arr)
    
    • 1
    • 2
    • 3
    • 4

    Map 构造函数可以将一个 二维 键值对数组转换成一个 Map 对象使用 Array.from 函数可以将一个 Map 对象转换成一个二维键值对数组
    在这里插入图片描述
    (2)Map 的克隆

    var myMap1 = new Map([["key1", "value1"], ["key2", "value2"]]);
    var myMap2 = new Map(myMap1);
    console.log(myMap2===myMap1)//false
    
    //Map 对象构造函数生成实例,迭代出新的对象。
    console.log(myMap2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    (3)Map 的合并

    var first = new Map([[1, 'one'], [2, 'two'], [3, 'three'],]);
    var second = new Map([[1, 'uno'], [2, 'dos']]);
    // 合并两个 Map 对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即 uno,dos, three
    var merged = new Map([...first, ...second]);
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    chatGPT训练过程
    CPP 新语法规则笔记
    JAVA 实现《超级玛丽升级版》游戏
    QNX: A guide for Realtime programmers
    网工内推 | 急聘网络运维,周末双休,厂商认证优先
    HackTheBox-Starting Point--Tier 1---Crocodile
    从无到有的基于QT软件的DIY桌面番茄钟(上)
    mac jdk,git,idea安装
    虹科分享 | 测试与验证复杂的FPGA设计(2)——如何在IP核中执行面向全局的仿真
    谈谈WorkManager线程池的设计
  • 原文地址:https://blog.csdn.net/weixin_40119412/article/details/105049424