Map

作者: nomooo | 来源:发表于2018-12-26 23:01 被阅读0次

JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是传统上只能用字符串当做键。这给它的使用带来了很大的限制。
为解决这个问题,ES6提供了Map数据结构,它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键。

    const m = new Map();
    const o = { p: 'hello' }

    m.set(o, 'content');//使用set方法,将对象o作为m的一个键
    //使用get方法读取
    console.log(m.get(o)); //content  
    console.log(m.has(o)); //true
    //使用delete方法删除
    m.delete(o);
    console.log(m.has(o)); //false

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

    const map = new Map([
        ['name', 'Mr Wang'],
        ['title', 'Author']
    ])

    console.log(map.size); //2 
    console.log(map.has('name')); // true
    console.log(map.get('name')); // Mr Wang
    console.log(map.has('title')); // true
    console.log(map.get('title')); // Author

Map构造函数接受数组作为参数,实际上是执行下面的操作

    const items = [
        ['name', 'Mr Wang'],
        ['title', 'Author']
    ]
    const map = new Map()
    items.forEach(
        ([key, value]) => map.set(key, value)
    )

注意:如果对一个键多次赋值,后面的值将覆盖前面的值

实例的属性和操作方法

  • size属性

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

    const map = new Map();
    map.set('one', 1);
    map.set('two', 2);

    console.log(map.size); // 2

-set(key,value)

set方法设置键名key对应值为value,然后返回整个Map结构,如果key已经有值,则键值会被更新,否则生成该键

    const map = new Map();
    map.set('one', 1);
    map.set('one', '一');
    map.set(2, 'two');
    map.set(undefined, true);

    console.log(map.get(undefined)); // true
    console.log(map.get(2)); // two
    console.log(map.get('one')); // 一

set方法返回的是当前的Map对象,因此可以采用链式写法

    let map = new Map().set(1, 'a').set(2, 'b').set(3, 'c')
  • get(key)

get方法读取key对应的键值,如果找不到,返回undefined

    const map = new Map();

    const hello = function() { console.log('Hello') }
    map.set(hello, 'Hello Mr'); // 键是函数

    console.log(map.get(hello)); //Hello Mr
  • has(key)

has方法返回一个布尔值,表示某个键是否在当前Map对象之中

    const map = new Map();
    map.set('one', 1);
    map.set(2, 'two');
    map.set(undefined, true);

    console.log(map.has(2)); //true
    console.log(map.has(undefined)); //true
    console.log(map.has("name")); //false

delete(key)
delete方法删除某个键,返回true,如果删除失败,返回false

    const map = new Map();
    map.set('one', 1);

    console.log(map.has('one')); //true
    console.log(map.delete('one')); //true
    console.log(map.has('one')); //false

clear()
clear方法清除所有成员,没有返回值

    const map = new Map();
    map.set('one', 1);
    map.set(2, 'two');
    map.set(undefined, true);
    console.log(map.size); //3
    map.clear()
    console.log(map.has('one')); //false
    console.log(map.size); //0

遍历方法与Set结构的数据大同小异,唯一需要注意的是Map的遍历顺序就是插入顺序

    const 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结构转为数组结构,比较快速的方法是使用拓展运算符(...)

    const map = new Map([
        [1, 'one'],
        [2, 'two'],
        [3, 'three'],
    ]);
    
    [...map.keys()]
    // [1, 2, 3]
    
    [...map.values()]
    // ['one', 'two', 'three']
    
    [...map.entries()]
    // [[1,'one'], [2, 'two'], [3, 'three']]
    
    [...map]
    // [[1,'one'], [2, 'two'], [3, 'three']]

相关文章

网友评论

      本文标题:Map

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