ES6 Set 与 Map 数据结构详解

5 篇文章 0 订阅

 评论区获取 Xmind 思维导图


目录

Set是一种叫做集合的数据结构

Map是一种叫做字典的数据结构

WeakSet和WekMap

WeakSet

WeakMap

共同点

不同点


Set是一种叫做集合的数据结构

是由一堆无序的、相关联的,且不重复的内存结构【数学中称为元素】组成的组合

  1. Set是es6新增的数据结构,类似于数组,但是成员的值都是唯一的,没有重复的值,我们一般称为集合
    1. 唯一值
  2. Set本身是一个构造函数,用来生成 Set 数据结构
    const s = new Set();
    1. 增删改查
      1. add()
        1. 添加某个值,返回 Set 结构本身
        2. 当添加实例中已经存在的元素,set不会进行处理添加
          s.add(1).add(2).add(2); // 2只被添加了一次
          
      2. delete()
        1. 删除某个值,返回一个布尔值,表示删除是否成功
          s.delete(1)
      3. has()
        1. 返回一个布尔值,判断该值是否为Set的成员
          s.has(2)
          
      4. clear()
        1. 清除所有成员,没有返回值
          s.clear()
          
    2. 遍历
      let set = new Set(['red', 'green', 'blue']);
       
      1. 三个遍历器生成函数和一个遍历方法
        1. keys()        返回键名的遍历器
          for (let item of set.keys()) {
            console.log(item);
          }
          // red
          // green
          // blue
        2. values()     返回键值的遍历器
          for (let item of set.values()) {
            console.log(item);
          }
          // red
          // green
          // blue
        3. entries()     返回键值对的遍历器
          for (let item of set.entries()) {
            console.log(item);
          }
          // ["red", "red"]
          // ["green", "green"]
          // ["blue", "blue"]
        4. forEach()   使用回调函数遍历每个成员
          1. forEach()用于对每个成员执行某种操作,没有返回值,键值、键名都相等,同样的forEach方法有第二个参数,用于绑定处理函数的this
            let set = new Set([1, 4, 9]);
            set.forEach((value, key) => console.log(key + ' : ' + value))
            // 1 : 1
            // 4 : 4
            // 9 : 9
      2. 扩展运算符和set结构结合实现数组或字符串去重
           let arr = [1, 2, 3, 4, 5, 6, 4, 4]
        
            let uniArr = [... new Set(arr)]
        
        
        
            console.log(uniArr);
        
            console.log("--------------------------------");
        
        
        
            let str = "sssssuuuuuuannnn"
        
            let uniStr = [...new Set(str)].join("")
        
            console.log(uniStr);
      3. 实现并集、交集和差集
        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}
        
        // (a 相对于 b 的)差集
        let difference = new Set([...a].filter(x => !b.has(x)));
        // Set {1}

Map是一种叫做字典的数据结构

是一些元素的集合。每个元素有一个称作key 的域,不同元素的key 各不相同

  1. Map类型是键值对的有序列表,而键和值都可以是任意类型
  2. Map本身是一个构造函数,用来生成 Map 数据结构
    const m = new Map()
  3. 增删改查
    1. size 属性       
      1.  返回 Map 结构的成员总数       
        const map = new Map();
        map.set('foo', true);
        map.set('bar', false);
        
        map.size // 2
    2. set()
      1. 设置键名key对应的键值为value,然后返回整个 Map 结构
      2. 如果key已经有值,则键值会被更新,否则就新生成该键
      3. 同时返回的是当前Map对象,可采用链式写法
        const m = new Map();
        
        m.set('edition', 6)        // 键是字符串
        m.set(262, 'standard')     // 键是数值
        m.set(undefined, 'nah')    // 键是 undefined
        m.set(1, 'a').set(2, 'b').set(3, 'c') // 链式操作
    3. get()
      1. get方法读取key对应的键值,如果找不到key,返回undefined
        const m = new Map();
        
        const hello = function() {console.log('hello');};
        m.set(hello, 'Hello ES6!') // 键是函数
        
        m.get(hello)  // Hello ES6!
    4. has()
      1. has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中
        const m = new Map();
        
        m.set('edition', 6);
        m.set(262, 'standard');
        m.set(undefined, 'nah');
        
        m.has('edition')     // true
        m.has('years')       // false
        m.has(262)           // true
        m.has(undefined)     // true
    5. delete()
      1. 删除某个键,返回true。如果删除失败,返回false
        const m = new Map();
        m.set(undefined, 'nah');
        m.has(undefined)     // true
        
        m.delete(undefined)
        m.has(undefined)       // false
        
    6. clear()
      1. 清除所有成员,没有返回值
        let map = new Map();
        map.set('foo', true);
        map.set('bar', false);
        
        map.size // 2
        map.clear()
        map.size // 0
  4. 遍历
    1. 三个遍历器生成函数和一个遍历方法
      const map = new Map([
        ['F', 'no'],
        ['T',  'yes'],
      ]);
       
      1. keys()                返回键名的遍历器
        for (let key of map.keys()) {
          console.log(key);
        }
        // "F"
        // "T"
      2. values()             返回键值的遍历器
        for (let value of map.values()) {
          console.log(value);
        }
        // "no"
        // "yes"
        
      3. entries()             返回所有成员的遍历器
        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"
        
      4. forEach()            遍历Map的所有成员
        map.forEach(function(value, key, map) {
          console.log("Key: %s, Value: %s", key, value);
        });

WeakSet和WekMap

WeakSet

  1. 创建WeakSet实例
    const ws = new WeakSet();
  2. WeakSet可以接受一个具有 Iterable接口的对象作为参数
    const a = [[1, 2], [3, 4]];
    const ws = new WeakSet(a);
    // WeakSet {[1, 2], [3, 4]}
    
  3. 在API中WeakSet与Set有两个区别
    1. 没有遍历操作的API
    2. 没有size属性
  4. WeakSet只能成员只能是引用类型,而不能是其他类型的值
    let ws=new WeakSet();
    
    // 成员不是引用类型
    let weakSet=new WeakSet([2,3]);
    console.log(weakSet) // 报错
    
    // 成员为引用类型
    let obj1={name:1}
    let obj2={name:1}
    let ws=new WeakSet([obj1,obj2]); 
    console.log(ws) //WeakSet {{…}, {…}}
  5. WeakSet里面的引用只要在外部消失,它在 WeakSet里面的引用就会自动消失

WeakMap

  1. WeakMap结构与Map结构类似,也是用于生成键值对的集合
  2. 在API中WeakMap与Map有两个区别
    1. 没有遍历操作的API
    2. 没有clear清空方法
      // WeakMap 可以使用 set 方法添加成员
      const wm1 = new WeakMap();
      const key = {foo: 1};
      wm1.set(key, 2);
      wm1.get(key) // 2
      
      // WeakMap 也可以接受一个数组,
      // 作为构造函数的参数
      const k1 = [1, 2, 3];
      const k2 = [4, 5, 6];
      const wm2 = new WeakMap([[k1, 'foo'], [k2, 'bar']]);
      wm2.get(k2) // "bar"
  3. WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
    const map = new WeakMap();
    map.set(1, 2)
    // TypeError: 1 is not an object!
    map.set(Symbol(), 2)
    // TypeError: Invalid value used as weak map key
    map.set(null, 2)
    // TypeError: Invalid value used as weak map key
  4. WeakMap的键名所指向的对象,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用

共同点

        集合、字典都可以存储不重复的值

不同点

        集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: ES6中的SetMap是两种新增的集合类型。Set是一种无重复值的集合,可以通过new Set()来创建。它具有add方法用于向集合中添加元素,has方法用于判断集合中是否存在某个元素,clear方法用于清空集合。Set也可以用于数组去重,通过new Set(\[...\])的方式将数组转换为Set,利用Set的特性去除重复值。\[1\] Map是一种键值对的集合,可以通过new Map()来创建。它具有set方法用于向集合中添加键值对,get方法用于获取指定键名对应的值,has方法用于判断集合中是否存在某个键名,clear方法用于清空集合。Map的键名可以是任意数据类型,包括引用值,但需要注意的是,引用值作为键名时,需要使用相同的引用地址才能获取到对应的值。\[2\] SetMap都可以使用for...of循环或forEach方法进行遍历。在Set中,forEach的第二个参数是集合的元素,因为Set中不存在下标。而在Map中,forEach的第一个参数是键值对的值,第二个参数是键值对的键名。\[3\] 总结来说,SetMapES6中新增的集合类型,Set用于存储无重复值的集合,Map用于存储键值对的集合。它们提供了一些方法来操作集合,如添加、获取、判断是否存在等。在使用时需要注意它们的特性和方法的使用方式。 #### 引用[.reference_title] - *1* *2* [ES6中的MapSet详解](https://blog.csdn.net/m0_45093055/article/details/126430467)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ES6中的setmap](https://blog.csdn.net/weixin_44247866/article/details/127561391)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值