倔老板再创业打算用set结构存数据

81 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

set结构

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。另外,NaNundefined都可以被存储在Set 中, NaN之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)

起因

倔老板上次创业失败了,毕竟第一创业,考虑不太周全,但是倔老板越挫愈勇,新学了es6的set结构。打算用set结构重构一下公司财务。

过去

倔老板过去只会数组方法,人力资源部门存储以下员工 张三 李四 和 王五,本来开始也很正常,公司运营稳定,利润可观,可是后来财务有了歪心思,知道老板js学的不好,都是按人头发工资,一个2300,三个人就6900,往里面又加了两个重复的人名,一下子就变成6900+4600=11500了。 老板是有点诧异的,但是一看这人名,都认识,确实是员工,也说不出哪里不对劲,这样一来,公司直接倒闭了

   var arr = ["张三", "李四", "王五"];
   var payment = arr.length * 2300;

老板听说es新出了set结构,决定让财务用set存储员工 创建set实例 ,可以将 Array 传递给 new Set() 构造函数。也可以后面用add方法添加。

    var letters = new Set(['张三','李四']);
    letters.add('王五')
    console.log(letters) // Set(3) {'张三', '李四', '王五'}

财务还是年轻,还想故技重施,往里加两重名的人。可是不管在构造函参数数里加,还是用add方法加,都没有用,财务也是一脸懵,每个值在 Set 中只能出现一次。

    var letters = new Set(['张三','李四','张三','李四']);
    letters.add('王五')
    letters.add('张三')
    letters.add('王五')
    console.log(letters) // Set(3) {'张三', '李四', '王五'}

财务不甘心,说人名太简单,可能有重名的员工导到时没法区分,老板觉得有理,可以,财务一波操作后,又成功混入,

     var letters = new Set([
      {
        name: "张三",
        age: 19,
        id: 1,
      },
      {
        name: "王五",
        age: 17,
        id: 2,
      },
      {
        name: "张三",
        age: 19,
        id: 1,
      },
      {
        name: "张三",
        age: 19,
        id: 1,
      },
      {
        name: "张三",
        age: 19,
        id: 1,
      },
    ]);
    letters.add(zs);
    console.log(letters);

多亏老板会点js,这隔壁村张三就一个,你这么整不行,你这根本不是一个对象,算法不对,要所有指针指向同一个引用,


    let zs = {
      name: "张三",
      age: 19,
      id:1
    };
    let ls = {
      name: "李四",
      age: 20,
      id:2
    };
    let ww = {
      name: "王五",
      age: 17,
      id:3
    };

    var letters = new Set([
      zs,
      ls,
      ww
     
    ]);
    letters.add(zs);
    console.log(letters); 

image.png

delete

财务直接气死了,再也挣不到黑心钱了,质问老板,这李四离职了,怎么删除?没法删除,老板呵呵了,delete方法了解一下


    var letters = new Set([zs, ls, ww]);
    letters.add(zs);
    letters.delete(ls)
    console.log(letters);

has

财务说,我三叔也是咱么员工,给他发个工资,老板说你三叔资料用has看一下,是不是有,财务测试了一下,心虚了,就不敢胡说了


   let sanshu={
      name:"三叔",
      age:18,
      id:4
    }

    var letters = new Set([zs, ls, ww]);
    console.log(letters.has(sanshu)); // false
    console.log(letters.has(ls)); //true

keys values entries

set的keys和values返回相同的迭代器,但是并不是相等的额,,set中的元素既是key也是value, entries 是有键值组成的Map结构


    var letters = new Set([zs, ls, ww]);
    
    console.log(letters.values(),letters.keys()===letters.keys()) // false

    for(let i of letters.keys()){
      console.log(i)
    }

forEach

为每个元素调用回调。遍历每个元素的key和value

size 属性

获取set实例里的元素个数

clear

清空set结构中所有元素,变成一个空的容器

set结构是加强版的数组,而且可以利用它的特性轻松去重。