一、Set是一组唯一值的集合(没有键),它的每一个值只能出现一次,可以按照添加顺序来遍历。
二、Set的主要方法如下:

  • new Set(iterable)—— 创建一个set,如果提供了一个iterable对象(通常是数组),将会从数组里面复制值到set中。
  • set.add(value)—— 添加一个值,返回 set 本身
  • set.delete(value)—— 删除值,如果value在这个方法调用的时候存在则返回true,否则返回false。
  • set.has(value)—— 如果value在 set 中,返回true,否则返回false。
  • set.clear()—— 清空 set。
  • set.size—— 返回元素个数。

【示例1】Set的基本操作

  1. var mySet = new Set()
  2. mySet.add(1)
  3. mySet.add('some text')
  4. mySet.add('foo')
  5. mySet.has(1) // true
  6. mySet.delete('foo')
  7. mySet.size // 2
  8. for (let item of mySet) {
  9. console.log(item)
  10. }
  11. // 1
  12. // 'some text'

三、Set的主要特点是,重复使用同一个值调用set.add(value)并不会发生什么改变。这就是Set里面的每一个值只出现一次的原因。
【示例1】我们有客人来访,我们想记住他们每一个人。但是已经来访过的客人再次来访,不应造成重复记录。每个访客必须只被“计数”一次。Set可以帮助我们解决这个问题:

let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

// visits,一些访客来访好几次
set.add(john);
set.add(pete);
set.add(mary);
set.add(john);
set.add(mary);

// set 只保留不重复的值
alert( set.size ); // 3

for (let user of set) {
  alert(user.name); // John(然后 Pete 和 Mary)
}

1、Set的替代方法可以是一个用户数组,用arr.find在每次插入值时检查是否重复。但是这样性能会很差,因为这个方法会遍历整个数组来检查每个元素。Set内部对唯一性检查进行了更好的优化。

Set 迭代(iteration)

一、可以使用for…of 或 forEach(Set有内置的forEach方法)来遍历Set
二、如果要在Set里使用循环,可以使用以下三个方法

  • set.keys()—— 遍历并返回所有的值(returns an iterable object for values),
  • set.values()—— 与set.keys()作用相同,这是为了兼容Map,
  • set.entries()—— 遍历并返回所有的实体(returns an iterable object for entries)[value, value],它的存在也是为了兼容Map。

【示例1】

let set = new Set(["oranges", "apples", "bananas"]);

for (let value of set) alert(value);

// 与 forEach 相同:
set.forEach((value, valueAgain, set) => {
  alert(value);
});

1、forEach的回调函数有三个参数:一个value,然后是同一个值valueAgain,最后是目标对象。没错,同一个值在参数里出现了两次。
2、forEach的回调函数有三个参数,是为了与Map兼容。当然,这看起来确实有些奇怪。但是这对在特定情况下轻松地用Set代替Map很有帮助,反之亦然。

Array与Set

Array和Set的对比

一、一般情况下,在JavaScript中使用数组来存储一组元素,而新的集合对象有这些优势:
1、数组中用于判断元素是否存在的indexOf 函数效率低下。
2、Set对象允许根据值删除元素,而数组中必须使用基于下标的 splice 方法。
3、数组的indexOf方法无法找到NaN值。
4、Set对象存储不重复的值,所以不需要手动处理包含重复值的情况。

数组和集合的转换

一、可以使用Array.from或展开操作符来完成集合到数组的转换。

Array.from(mySet)
[...mySet2]

二、Set的构造函数接受数组作为参数,可以完成从Array到Set的转换。
1、Set对象中的值不重复,所有数组转换为集合时,所有重复值将会被删除。

mySet2 = new Set([1, 2, 3, 4])