1.什么是map

它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

声明语法1:  使用构造函数来声明Map类型

const map = new Map();

声明语法2:  在声明map数据类型的同时,定义数值

在()中以 二维数组的形式,定义存储的数据
每一个二维数值的单元,就是Map类型存储的一个单元
二维数组的第一个单元是Map单元的键名,二维数组的第二个单元是Map单元的键值

const map = new Map([ [ '键名' , '键值' ] , ['键名' , '键值'] , ['键名' , '键值'] , ['键名' , '键值']....  ] );

新增单元

map类型.set(参数1,参数2)

参数1:新增单元的键名
参数2:新增单元的键值

调用使用

map类型.get(键名)

通过键名来调用键值
不用管 0,1,2...的索引,直接拿键名调用数据

删除:  删除一个

map类型.delete('键名')

通过键名来删除单元

清除:  删除所有

map类型.clear()

循环:  与普通的forEach() 循环 完全一样

map类型.forEach((键值,键名=>{})

判断:  map中是键名

map类型.has('键名')  结果是布尔类型

size属性返回 Map 结构的成员总数

map.size

    // 声明的同时,来定义数据
    const map = new Map([ ['name','张三'] , ['age',18] , ['sex','男'] , ['arr' , [1,2,3,4,5]] , ['obj' , {phone:123,addr:'北京'}] ]);
    // 新增单元
    map.set('fun' , ()=>{console.log(123)});
    // 调用  不用管 0,1,2...的索引,直接拿键名调用数据
    console.log( map.get('name') );  //张三
    console.log( map.get('obj') );  //{phone:123,addr:'北京'}
    console.log( map.get('obj').addr );  //北京
    // 删除单元
    map.delete('name');
    // 循环遍历 与 普通的forEach 完全相同
    map.forEach( (v,k)=>{
        console.log(v,k);  //v键值  k键名
    })
    // 判断是否是map中的成员
    console.log( map.has('age') );  //ture
    // 清除所有单元
    map.clear();
    map.size // 0

注意

如果对同一个键多次赋值,后面的值将覆盖前面的值
    const map = new Map(); 
    map.set(1, 'aaa').set(1, 'bbb');
    map.get(1) // "bbb"
如果读取一个未知的键,则返回undefined
    new Map().get('asfddfsasadf')      // undefined
只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。
    const map = new Map();
    map.set(['a'], 555);
    map.get(['a']) // undefined
同理,同样的值的两个实例,在 Map 结构中被视为两个键。
    const map = new Map();
    const k1 = ['a'];
    const k2 = ['a'];
    map.set(k1, 111).set(k2, 222);
    map.get(k1) // 111

keys(): 返回键名的遍历器。
values(): 返回键值的遍历器。
entries(): 返回所有成员的遍历器。
forEach(): 遍历 Map 的所有成员。

map的循环遍历
        let map = new Map([  
        ['F', 'no'],  
        ['T', 'yes'],  
    ]);  
    for (let key of map.keys()) {  
        console.log(key);  // "F"  // "T"
     
    }  
    for (let value of map.values()) {  
        console.log(value);  // "no"  // "yes" 
     
    }  
    for (let item of map.entries()) {  
        console.log(item[0], item[1]);   // "F" "no"  // "T" "yes"
    }  
    //  或者  
    for (let [key, value] of map.entries()) {  
        console.log(key, value);  // "F" "no"  // "T" "yes"
    }  
    //  等同于使用 map.entries()  
    for (let [key, value] of map) {  
        console.log(key, value); // "F" "no"  // "T" "yes"
    }
Map 结构转为数组结构, 比较快速的方法是结合使用扩展运算符(...)。
    let map = new Map([  
        [1, 'one'],  
        [2, 'two'],  
        [3, 'three'],  
    ]);  
    console.log([...map.keys()])
    // [1, 2, 3]  
    console.log([...map.values()])
    // ['one', 'two', 'three']  
    console.log([...map.entries()])
    // [[1,'one'], [2, 'two'], [3, 'three']]  
    console.log([...map])
    // [[1,'one'], [2, 'two'], [3, 'three']]
如果所有 Map 的键都是字符串, 它可以转为对象
    function strMapToObj(strMap) {  
        let obj = Object.create(null);  
        for (let [k, v] of strMap) {  
            obj[k] = v;  
        }  
        return obj;  
    }  
    let myMap = new Map().set('yes', true).set('no', false);  
    strMapToObj(myMap)  
    // { yes: true, no: false }  
Map 转为 JSON 要区分两种情况。 一种情况是, Map 的键名都是字符串, 这时可以选择转为对象 JSON。
    function strMapToJson(strMap) {  
        return JSON.stringify(strMapToObj(strMap));  
    }  
    let myMap = new Map().set('yes', true).set('no', false);  
    strMapToJson(myMap)  
    // '{"yes":true,"no":false}'
另一种情况是, Map 的键名有非字符串, 这时可以选择转为数组 JSON。
    function mapToArrayJson(map) {  
        return JSON.stringify([...map]);  
    }  
    let myMap = new Map().set(true, 7).set({  
        foo: 3  
    }, ['abc']);  
    mapToArrayJson(myMap)  
    // '[[true,7],[{"foo":3},["abc"]]]' 

一沙一世界,一花一天堂。君掌盛无边,刹那成永恒。