最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • ES6-Set集合与Map集合

    正文概述 掘金(你不对劲_)   2020-12-27   501

    Set

    • 新增的一种数据结构类型,它是一个构造函数,我们先创建一个看看是个什么东西。

      const set = new Set();
      console.log(set);
      

           ES6-Set集合与Map集合               ES6-Set集合与Map集合

    • 下面我们就介绍几个原型上常用的方法,来了解一下Set到底是怎么样的。                              1. add(value),在Set结构末尾添加一个元素,并且返回Set结构(可以链式调用)。我们发现添加的重复元素在Set中自动被过滤,得出Set的成员具有唯一性。
    •   const set = new Set();
        set.add(3)
           .add(6)
           .add(3)
           .add(3);
        console.log(set); // -> Set(2) {3, 6}
          
        // 也可以构造函数初始化参数,但是参数的形式只能是具备iterator接口的数据结构
        const set1 = new Set([3, 6, 6, 6, 6, 6]);
        console.log(set1); // -> Set(2) {3, 6}
          
        // 判断一些特殊的值
        const test = new Set([undefined, undefined, null, null, 3, '3', NaN, NaN]);
        console.log(test);
        // 结果 ->  
        Set(5) {undefined, null, 3, "3", NaN}
          [[Entries]]
            0: undefined
            1: null
            2: 3
            3: "3"
            4: NaN  // -> NaN === NaN
          size: (...)
          __proto__: Set
      

           2. delete(),删除Set结构中的元素,返回值是一个布尔值。size(),Set结构的长度

         (相当于数组的length)

    •   let x = {id: 1},
            y = {id: 2};
        const set = new Set();
        set.add(x)
           .add(y)
           .add(x); // 这里我们拿的对象的引用,所以就相当于同一个对象
        console.log(set); // -> 左图
        console.log(set.size); // -> 2
        set.delete(y);
        console.log(set); // -> 右图
      

           ES6-Set集合与Map集合                                   ES6-Set集合与Map集合

           3. clear(),清空Set结构中的所有值。

    •   const set = new Set([1, 2, 3, 4, 5]);
        console.log(set); // -> Set(5) {1, 2, 3, 4, 5}
        set.clear();
        console.log(set); // -> Set(0) {}
      

           4. has(value),判断当前Set结合是否存在该值,返回一个布尔值。

    •   const set = new Set(['zhangsan', 'lisi', 'wangwu']);
        console.log(set.has('zhangsan')); // -> true
        console.log(set.has('zhaoliu')); // -> false
      

           5. keys() / values() / entries(),返回一个迭代器对象。我们发现key和value相同。

    •   const set = new Set(['a', 'b', 'c']);
        for(let item of set.keys()){
          console.log(item); // -> a  b  c
        }
        // set结构中不存在key
        for(let item of set.values()){
          console.log(item); // -> a  b  c
        }
        for(let item of set.entries()){
          console.log(item); // -> ['a', 'a'] ['b', 'b'] ['c', 'c']
        }
      

           6. forEach(),Set本身没有key,所以forEach方法中的key被设置为了元素本身。

    •   const set = new Set([1, 2, 3]);
        set.forEach((item, key) => {
          console.log(item, key); // ->  1 1  2 2  3 3
        })
      
    • 最简单的数组去重

      let arr = [1, 2, 2, 1, 3, 3, 3];
      let set = new Set(arr);
      arr = [...set];
      console.log(arr); // -> [1, 2, 3]
      
    • 交集、并集、差集

      let a = new Set([1, 2, 3]),
          b = new Set([2, 3, 4]);
          
      let intersect = new Set([...a].filter(item => b.has(item)));
      console.log(intersect); // -> Set(2) {2, 3}
          
      let union = new Set([...a, ...b]);
      console.log(union); // -> Set(4) {1, 2, 3, 4}
          
      let differenceA = new Set([...a].filter(item => !b.has(item)));
      console.log(differenceA); // -> Set(1) {1}
          
      let differenceB = new Set([...b].filter(item => !a.has(item)));
      console.log(differenceB); // -> Set(1) {4}
      

    Map

    • 如果说Set像数组,那Map就更像对象,他比对象更强大,对象的key只支持字符串,而Map的key支持所有的数据类型,就可以实现键与值一一对应的关系。Map集合的原型上多了两个方法set()get(), 没有了add() 方法。

      // 对象key的问题
      let a = {id: 1},
          b = {id: 2},
          c = {};
      c[a] = 'foo';
      c[b] = 'bar';
          
      console.log(c[a]); // -> bar
      console.log(c[b]); // -> bar
      // 因为对象的key只支持字符串,所以通过调用toString方法, 他们两个的key都是'[object Object]'
          
      let map = new Map();
      console.log(map);
      map.set(a, 'foo');
      map.set(b, 'bar');
      console.log(map); // -> Map(2) {{…} => "foo", {…} => "bar"}
      // 获取值 要用 get方法
      console.log(map.get(a)); // -> foo
      console.log(map.get(b)); // -> bar
      

           ES6-Set集合与Map集合                     ES6-Set集合与Map集合

    • 初始化参数不仅要满足是具备iterator接口的数据结构,并且里面的每一个元素都要是一个双元的数组结构,数组中第一个是键名,第二个是键值。

      const m = new Map([
        ['name', 'zhangsan'], 
        ['age', 22]
      ]);
          
      console.log(m); // -> Map(2) {"name" => "zhangsan", "age" => 22}
      
    • 特殊值覆盖的问题

      const map = new Map();
          
      map.set(-0, 123);
      console.log(map.get(+0)); // -> 123
      console.log(+0 === -0); // -> true
      Object.is(+0, -0); // -> false
          
      map.set(true, 1);
      map.set('true', 2);
      console.log(map.get(true)); // -> 1
          
      map.set(undefined, 1);
      map.set(null, 2);
      console.log(map.get(undefined)); // -> 1
          
      // 上面的都符合的是 === 规则,这里的NaN走的是Object.is()
      map.set(NaN, 3);
      console.log(map.get(NaN)); // -> 3
      console.log(NaN === NaN); // -> false
      console.log(Object.is(NaN, NaN)); // -> true
      
    • Map转化

      // Map -> 数组
      let map = new Map();
      map.set(true, 1);
      map.set({a: 1}, ['f', 'o', 'o']);
      let res = [...map];
          
      // 数组 -> Map
      let map = new Map([
        [true, 1],
        [{a: 1}, ['f', 'o', 'o']]
      ])
          
      // Map -> 对象
      let map = new Map();
      Map.set('name', 'rich brian');
      // 有一个条件 Map 成员的 key 必须为字符串
      function strMapToObj (strMap) {
        let obj = Object.create(null);
          
        for(let [key, val] of strMap.entries()){
          obj[key] = val;
        }
          
        return obj;
      }
      strMapToObj(map);
          
      // 对象 -> Map
      let obj = {
        a: 33,
        b: false
      }
          
      function objToMap (obj) {
        let map = new Map();
          
        for(let key of Object.keys(obj)) {
          map.set(key, obj[key]);
        }
            
        return map;
      }
      objToMap(obj);
      

    总结

           Set集合可以用来过滤数组中重复的元素(成员的唯一性),只能通过has()方法来检测值是否存在,或是通过遍历来处理每个值(因为Set没有key)。Map集合可以看做是比Object更加强大的对象。


    起源地下载网 » ES6-Set集合与Map集合

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元