Skip to content

JavaScript中的集合操作

数学中的集合操作可以轻松应用于JavaScript的Set对象和数组。这个代码片段集合将向您介绍最常见的集合操作,如并集、交集和差集。

[!NOTE]

在撰写本文时,原生支持此操作的Set对象正在开发中,但仍处于早期阶段。如果您计划使用原生方法,请确保检查环境兼容性。

并集

两个集合的并集是一个包含至少在两个集合中出现一次的所有元素的集合。为了计算它,您可以使用扩展运算符(...)将Set对象转换为数组,并从结果数组创建一个新的Set

const union = (a, b) => new Set([...a, ...b]);

union(new Set([1, 2, 3]), new Set([4, 3, 2]));
// Set(4) { 1, 2, 3, 4 }

交集

两个集合的交集是一个包含存在于两个集合中的所有元素的集合。为了计算它,您可以使用Array.prototype.filter()Set.prototype.has()来过滤掉在第二个集合中不存在的所有元素。

const intersection = (a, b) => new Set([...a].filter(x => b.has(x)));

## 交集

两个集合的**交集**是一个包含所有**存在于第一个集合但不存在于第二个集合中的元素**的集合。为了计算交集,可以使用与上面相同的方法,但是对`Set.prototype.has()`的结果取反。

```js
const intersection = (a, b) => new Set([...a].filter(x => b.has(x)));

intersection(new Set([1, 2, 3]), new Set([4, 3, 2]));
// Set(2) { 2, 3 }

差集

两个集合的差集是一个包含所有存在于第一个集合但不存在于第二个集合中的元素的集合。为了计算差集,可以使用与上面相同的方法,但是对Set.prototype.has()的结果取反。

const difference = (a, b) => new Set([...a].filter(x => !b.has(x)));

difference(new Set([1, 2, 3]), new Set([4, 3, 2]));
// Set(1) { 1 }

对称差集

两个集合的对称差集是一个包含所有存在于任一集合中但不存在于两个集合中的元素的集合。为了计算对称差集,可以计算每个集合与另一个集合的差集,然后计算两个结果的并集。

const symmetricDifference = (a, b) =>
  new Set([...[...a].filter(x => !b.has(x)), ...[...b].filter(x => !a.has(x))]);

symmetricDifference(new Set([1, 2, 3]), new Set([4, 3, 2]));
// Set(2) { 1, 4 }

应用于数组

所有这些代码片段都可以通过将它们转换为Set对象,然后将结果转换回原始类型来轻松应用于数组或其他可迭代对象

除此之外,数组还可以利用潜在的性能优化,具体取决于使用情况。例如,您可以使用Array.prototype.some()Array.prototype.includes()检查两个数组是否相交,而不必计算它们的交集。

const intersects = (a, b) => a.some(x => b.includes(x));

intersects(['a', 'b'], ['b', 'c']); // true
intersects(['a', 'b'], ['c', 'd']); // false