32.集(Set

原文: http://exploringjs.com/impatient-js/ch_sets.html

在 ES6 之前,JavaScript 没有集合的数据结构。相反,使用了两种解决方法:

  • 对象的键作为字符串集。
  • 数组作为任意值的集合(例如,通过.includes()检查元素是否在集合中)。

ECMAScript 6 具有数据结构Set,适用于任意值。

32.1。使用集合

32.1.1。创建集

创建集合有三种常用方法。

首先,您可以使用不带任何参数的构造函数来创建空集:

其次,您可以将迭代(例如,数组)传递给构造函数。迭代值成为新集的元素:

第三,.add()方法将元素添加到 Set 并且是可链接的:

32.1.2。添加,删除,检查包含

.add()向 Set 添加元素。 .has()检查某个元素是否包含在一个集合中。 .delete()从 Set 中删除元素。

32.1.3。确定 Set 的大小并清除它

.size包含 Set 中的元素数。 .clear()删除 Set 的所有元素。

32.1.4。迭代一组

集是可迭代的,for-of循环按预期工作:

如您所见,集合保留迭代顺序。也就是说,元素总是按照添加顺序迭代。

Spreading(...)到数组可以与 iterables 一起使用,因此可以将 Set 转换为数组:

32.1.4.1。从数组和字符串中删除重复项

将数组转换为 Set 并返回,从数组中删除重复项:

字符串也是可迭代的,因此可以用作new Set()的参数:

32.2。比较 Set 元素

与 Maps 一样,元素与===类似地进行比较,但NaN等于它自身。

第二次添加元素无效:

===类似,两个不同的对象永远不会被认为是相同的(目前无法自定义):

32.3。缺少 Set 操作

集合缺少几个常见操作。它们通常可通过以下方式实施:

  • 将集转换为数组(通过传播(...)。
  • 执行操作。
  • 将结果转换回 Set。

32.3.1。制图

32.3.2。过滤

32.3.3。联盟

Union(ab):创建一个包含 Set a和 Set b元素的 Set。

32.3.4。路口

交点(ab):创建一个包含 Set a元素的 Set,它们也在 Set b中。

32.3.5。区别

差值(a \ b):创建一个包含 Set a中不在 Set b中的元素的 Set。该操作有时也称为 减去 -)。

32.4。快速参考:Set<T>

32.4.1。构造函数

  • new Set<T>(values?: Iterable<T>) [ES6]

    如果未提供参数values,则会创建一个空集。如果这样做,则迭代值将作为元素添加到 Set 中。例如:

32.4.2。 Set<T>.prototype:单个设置元素

  • .add(value: T): this [ES6]

    value添加到此 Set。此方法返回this,这意味着它可以链接。

  • .delete(value: T): boolean [ES6]

    从此 Set 中删除value

  • .has(value: T): boolean [ES6]

    检查value是否在此设置中。

32.4.3。 Set<T>.prototype:所有 Set 元素

  • get .size: number [ES6]

    返回此 Set 中有多少元素。

  • .clear(): void [ES6]

    从此 Set 中删除所有元素。

32.4.4。 Set<T>.prototype:迭代和循环

  • .values(): Iterable<T> [ES6]

    返回此 Set 的所有元素的可迭代。

  • [Symbol.iterator](): Iterable<T> [ES6]

    迭代 Set 的默认方式。与.values()相同。

  • .forEach(callback: (value: T, value2: T, theSet: Set<T>) => void, thisArg?: any): void [ES6]

    循环遍历此 Set 的元素,并为每个元素调用回调(第一个参数)。 valuekey都设置为元素,因此该方法与Map.prototype.forEach的工作方式类似。如果提供了thisArg,则为每个呼叫设置this。否则,this设置为undefined

32.4.5。与Map对称

仅存在以下两种方法,以使 Sets 的接口类似于 Maps 的接口。处理每个 Set 元素就好像它是一个 Map 键,其键和值是元素。

  • Set.prototype.entries(): Iterable<[T,T]> [ES6]
  • Set.prototype.keys(): Iterable<T> [ES6]

.entries()使您可以将 Set 转换为 Map:

32.集(Set) - 图1 测验

参见测验应用程序