set

Set

ES6提供的一种新的数据结构Set。和数组类似但是成员的值都是唯一不重复的,本身是一个构造函数,用来生成Set 数据结构。

const s = new Set();
[2,3,4,5,6,7,2,2].forEach(x=>s.add(x));
for (let i of s){
    console.log(i);
}
//2,3,4,5,6,7

通过add()方法向Set结构加入成员,结果表明Set结构不会添加重复值。

Set 函数可以接受一个数组用来初始化

const set = new Set([1,2,3,4,5,4]);
[...set]
//1,2,3,4,5

可以用来去除数组重复成员

[...new Set(array)]

去除字符串里的重复字符

[... new Set('abcabc)].join('')
// abc

向Set加入值的时候,不会发生类型转换,所以5和”5”是两个不同的值

Set结构的实例有以下属性

  • Set.prototype.constructor:构造函数
  • Set.prototype.size:返回Set实例的成员总数

操作方法

  • Set.prototype.add(value):添加某个值,返回Set结构本身
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除成功
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为S成员
  • Set.prototype.clear():清楚所有成员,没有返回值

    s.add(1).add(2).add(2)

    s.size //2
    s.has(1) //true
    s.has(2) //true
    s.has(3) //false

    s.delete(2);
    s.has(2) //false

去除数组重复成员的一个方法

function dedupe(array){
 return Array.from(new Set(array));
}
dedupe([1,1,2,3]); //[1,2,3]

遍历操作

  • Set.prototype.keys();返回键名
  • Set.prototype.values();返回键值
  • Set.prototype.entries();返回key value
  • Set.prototype.forEach():使用回调函数遍历每个成员
    由于 Set 结构没有键名,只有键值(或者说键名和键值是同一个值),所以keys方法和values方法的行为完全一致。
    特别值得注意的是,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"]
//entries方法返回的遍历器,同时包括键名和键值,所以每次输出一个数组,它的两个成员完全相等。

Set结构的实例默认可遍历,默认的遍历器就是values方法,可以省略valuse方法,直接用for…of循环遍历Set

let set = new Set(['red','green','blue']);
for (let x of set){
    console.log(x);
}

// red
// green
// blue

forEach()

let set = new Set([1,4,9]);
set.forEach((value,key)=>console.log(key+':'+value))
//1:1
// 4 : 4
// 9 : 9

遍历的应用

let set = new Set(['red','green','blue']);
let arr =[...set];
//['red', 'green', 'blue']

扩展运算符和 Set 结构相结合,就可以去除数组的重复成员。

let arr =[3,4,5,5,5,3,2];
let unique =[...new Set(arr)];
//[3,4,5,2]

数组的map和filter方法也可以间接用于 Set

let set = new Set([1,2,3]);
set = new Set([...set].map(x=>x*2));
//返回Set结构{2,4,6}

let set =new Set([1,2,3,4,5]);
set = new Set([...set].filter(x=>(x%2)==0));
//返回Set结构{2,4}

使用 Set 可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)

   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}

在遍历操作中,同步改变原来的Set结构,用Set结构映射出一个新的结构,或者是用Array.from的方法
//方法一
let set = new Set([1,2,3]);
set = new Set([…set].map(val=>val2));
//set的值是2,4,6
//方法二
let set = new Set([1,2,3]);
set = new Set(Array.from(set,val=>val
@));