美文网首页
18- Map 结构

18- Map 结构

作者: 夏海峰 | 来源:发表于2018-08-21 18:04 被阅读8次

    1、Map 结构

    JavaScript 的对象(Object),本质上是键值对的集合(Hash 结构),但是传统上只能用字符串当作键。

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

    const m = new Map();
    const o = { p: 'hello world'};
    
    m.set(o, 'content'); // 键名是一个对象
    m.get(o);   // 'content'
    
    m.has(o);   // true
    m.delete(o);
    

    作为构造函数,Map 也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。

    const map = new Map([['name', '张三'], ['title', '律师']]);
    map.size;  // 2
    map.has('name');   // true
    map.get('title');  // '律师'
    

    事实上,不仅仅是数组,任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数。这就是说,Set和Map都可以用来生成新的 Map。

    如果对同一个键多次赋值,后面的值将覆盖前面的值。

    map.set(1, 'aaa').set(1, 'bbb');
    map.get(1);  // 'bbb'
    

    2、Map的实例属性和操作方法

    size
    set()
    get()
    has()
    delete()
    clear()
    

    3、Map的遍历方法

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

    Map 的遍历顺序就是插入顺序。

    const map = new Map([['a', 'aaa'], ['b', 'bbb']]);
    for(let [key,value] of map.entries()) {
        console.log(key, value);
    }
    // 'a' 'aaa'
    // 'b' 'bbb'
    

    Map 结构转为数组结构,比较快速的方法是使用扩展运算符(...)。

    [...map];
    [...map.keys()];
    [...map.values()];
    [...map.entries()];
    

    Map 还有一个forEach方法,与数组的forEach方法类似,也可以实现遍历。forEach方法还可以接受第二个参数,用来绑定this。

    4、Map结构与其它结构进行相互转换

    Map 转成 数组
    数组 转成 Map
    Map 转成 对象
    对象 转成 Map
    Map 转成 JSON
    JSON 转成 Map
    

    5、WeakMap

    WeakMap结构与Map结构类似,也是用于生成键值对的集合。
    WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
    WeakMap的键名所指向的对象,不计入垃圾回收机制。

    WeakMap 没有遍历操作(即没有key()、values()和entries()方法),也没有size属性。

    const k1 = [1, 2, 3];
    const k2 = [4, 5, 6];
    const wm = new WeakMap([[k1, 'foo'], [k2, 'bar']]);
    wm.get(k2) // "bar"
    

    完!!!

    相关文章

      网友评论

          本文标题:18- Map 结构

          本文链接:https://www.haomeiwen.com/subject/bqgjiftx.html