Set

  • 类似于数组,但成员唯一

  • (Array)可以接受数组作为参数用于初始化

    //数组去重
    [...new Set(array)]
    Array.from(new Set(array))
    
    //字符串去重
    [...new Set('aabbccdd')].join('')
    
  • (Add)Set中add值的时候不会发生类型转换

    • 但是Set内部任务NaN是同一个值;精确运算中NaN并不等于自身

    • 例如:5和‘5’是两个值

      let set = new Set();
      let a = NaN;
      let b = NaN;
      set.add(a);
      set.add(b);
      console.log(set);    //{NaN}
      
  • (Object)Set中两个对象总是不相等的

    let set = new Set();
    set.add({});
    console.log(set.size);    //1
    set.add({});
    console.log(set.size);    //2
    

Set实例的属性和方法

  • size 成员数目
  • add() 添加成员;返回本身
  • delete() 删除本身;返回布尔值
  • has() 查询是否包含;返回布尔值
  • clear() 清除所有成员;没有返回值

Set遍历操作

  • keys() 返回键名
  • values() 返回值(由于Set没有键名;因此它keys和values所得的值完全一样)
  • entries() 返回键值对
  • forEach() 使用回调函数遍历每个成员
let set = new Set(["aaa","bbb","ccc"]);
for(let item of set.keys()){
console.log(item)    //aaa bbb ccc
}
for(let item of set.values()){
console.log(item)    //aaa bbb ccc
}
for(let item of set.entries()){
console.log(item)    //["aaa","aaa"] ["bbb","bbb"] ["ccc","ccc"]
}
  • Set结构的实例默认可遍历,默认的遍历生成器的函数就是values方法,因此可以用for of直接遍历;也可以直接用forEach

    let set = new Set(["aaa","bbb","ccc"]);
    for(let item of set){
        console.log(item)    //aaa bbb ccc
    }
    
    let set = new Set(["aaa","bbb","ccc"]);
    set.forEach((value,key)=>{
    console.log(key+':'+value)//aaa:aaa bbb:bbb ccc:ccc
    })
    

Set实现并集、交集、差集

let a = new Set([1,2,3,4]);
let b = new Set([3,4,5,6]);

//并集
let union = new Set([...a,...b]);

//交集
let intersect = new Set([...a].fliter(x => b.has(x)));

//差集
let difference = new Set([...a].fliter(x => !b.has(x)))

遍历操作中同步改变Set中的值

  • set映射出新的结构
let set = new Set([1,2,3]);
set = new Set([...set].map(item => item*2));
console.log(set)//2,4,6
  • 利用Array.from

    let set = new Set([1,2,3]);
    set = new Set(Array.from(set,val => val*2));
    console.log(set);    //2,4,6
    

results matching ""

    No results matching ""