美文网首页
es6学习之Set和Map结构

es6学习之Set和Map结构

作者: 紫陌兰溪 | 来源:发表于2018-05-21 14:49 被阅读0次

    一.Set结构

    Set结构是类似于数组结构,但是成员都是不重复的值(判断不重复类似Object.is()方法,但是+0和-0又是相同的处理,Object.is(+0,-0); // false)

    缺点是没办法像数组一样通过下标取值的方法.
    

    WeekSet结构和Set相似,但是成员只能是对象,且对象是弱引用(成员中的对象不存在了,在本结构中也就不存在了),重点是没有size属性,没有遍历接口

    1.构造

    任何具有Iterator接口的数据结构都能作为new Set的参数

    let set = new Set([1,2,3]);
    set.size    // 3
    

    2.属性和方法

    (1)属性

    • Set.prototype.constructor 构造函数:就是set本身
    • Set.prototype.size :set的成员总数

    (2)操作方法

    • add(value) 添加值,返回添加后set本身
    • delete(value) 删除某个值,返回Boolean,是否删除成功
    • has(value) 是否含有某一个值,返回Boolean,是否有这个值
    • clear() 请求所有成员,void
    • s.add(1).add(2).add(2);
      // 注意2被加入了两次
    s.size // 2
    
    s.has(1) // true
    s.has(2) // true
    s.has(3) // false
    
    s.delete(2);  // true
    s.has(2) // false
    

    (3)遍历方法

    • keys() 返回键名的遍历器
    • values() 返回键值的遍历器
    • entries() 返回键值对的遍历器
    • forEach() 使用回掉函数遍历每一个set成员
    let set = new Set(['red', 'green', 'blue']);
    for (let item of set.keys()) {
      console.log(item);
    }
    // red
    // green
    // blue
    
    for (let item of set.values()) {
      console.log(item);
    }
    // red
    // green
    // blue
    
    for (let item of set.entries()) {
      console.log(item);
    }
    // ["red", "red"]
    // ["green", "green"]
    // ["blue", "blue"]
    
    set2 = new Set([1, 4, 9]);
    set2.forEach((value, key) => console.log(key + ' : ' + value))
    // 1 : 1
    // 4 : 4
    // 9 : 9
    

    3.应用

    (1)数组去重

    let arr = [1,2,3,4,5,4,23,1,3];
    arr= Array.from(new Set(arr));  // [1, 2, 3, 4, 5, 23]
    

    (2)扩展运算符解构set

    let arr = [1,2,3,4,5,4,23,1,3];
    let set = new Set(arr);
    let arr4 = [...set];    // [1, 2, 3, 4, 5, 23]
    

    (3)set实现交集,并集,差集

    let a = new Set([1, 2, 3]);
    let b = new Set([4, 3, 2]);
    // 并集
    let union = new Set([...a, ...b]);
    // Set {1, 2, 3, 4}
    
    // 交集
    let intersect = new Set([...a].filter(x => b.has(x)));
    // set {2, 3}
    
    // 差集
    let difference = new Set([...a].filter(x => !b.has(x)));
    // Set {1}
    

    二.Map结构

    Map结构是键值对集合(Hash结构).Map可以使用对象作为键名.map内部的键名的重复检测和Set相同
    WeekMap结构类似Map,区别是键名只能是对象,且对象是弱引用,类似于WeekSet的弱引用

    1.构造

    任何具有Iterator接口的数据结构都能被Map构造为Map结构,但是结构要有一定的定制,类似于下方的数组的结构

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

    2.属性和方法

    (1)属性

    • Map.prototype.size :Map的成员数量

    (2)操作方法

    • set(key,value) 向map设置一个值,已有键名的会被覆盖,否则会新建,返回设置后的map
    • get(key) 读取key对应的键值,没有则返回undefined
    • has(key) 查找map中有没有某个键名,返回Boolean
    • clear() 清楚所有成员,void

    (3)遍历方法

    和Set拥有同样的遍历方法

    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.forEach(function(value, key, map) {
      console.log("Key: %s, Value: %s", key, value);
    });
    

    相关文章

      网友评论

          本文标题:es6学习之Set和Map结构

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