JS集合中的并集、交集、差集



JS集合中的并集、交集、差集关注下方公众号,获取更多热点资讯JS集合中的并集、交集、差集


JavaScript在 ES2015 规范中被引入到该语言中Set,但它似乎一直不完整。这种情况即将改变。

集合是值的集合,其中每个值只能出现一次。在 的 ES2015 版本中Set,可用功能围绕创建、添加、删除和检查Set. 如果您想对多个集合进行操作或比较,则必须编写自己的函数。值得庆幸的是,TC39(为制定 ECMAScript 规范而成立的委员会)和浏览器一直在致力于此。我们现在在 JavaScript 实现中看到了union、intersection和等函数difference。

在了解新功能之前,让我们回顾一下 JavaScript Sets 现在可以做什么,然后我们将在下面介绍新的 Set 函数以及支持它们的 JavaScript 引擎。

ES2015 JavaScript 集有什么作用?

我们来看看 ES2015 版本的 JavaScriptSet能做什么。通过一些例子最容易做到这一点。

您可以构造一个Set不带任何参数的 a ,这会给您一个空的Set. 或者,您可以提供一个可迭代对象(如数组)来初始化Set.

const languages = new Set(["JavaScript""TypeScript""HTML""JavaScript"]);

Sets 只能包含唯一值,因此Set上面有三个成员。您可以向访问size属性核实这一点。

languages.size;

// => 3

Set您可以使用addfunction添加更多元素。添加已经存在的元素Set不会执行任何操作。

languages.add("JavaScript");

languages.add("CSS");

languages.size;

// => 4

您可以从Setwith中删除元素delete。

languages.delete("TypeScript");

languages.size;

// => 3

Set您可以使用函数has检查某个元素是否是 的成员。a 的好处之一是该检查可以在常数时间内 ( O(1)Set )完成,而检查元素是否在 an 中的时间因( O(n) )的长度而异。使用s 来完成这样的任务是一种编写有意的高效代码的干净方法。ArrayArraySet

languages.has("JavaScript");

// => true

languages.has("TypeScript");

// => false

您可以使用or循环遍历 aSet的元素forEachfor…of。元素按照添加到 的顺序排序Set。

languages.forEach(element => console.log(element));

// "JavaScript"

// "HTML"

// "CSS"

您还可以通过Set使用keys和values函数(实际上是等效的)以及该entries函数来获取迭代器。最后,您可以使用该clear函数清空 Set。

languages.clear();

languages.size;

// => 0

新的 Set 功能有哪些?

方法Set提案将以下方法添加到Set实例中:union、intersection、difference、symmetricDifference、isSubsetOf、isSupersetOf和isDisjointFrom。

其中一些方法类似于一些 SQL 连接,我们将用它们来说明代码和结果。让我们看看每个函数的作用的一些示例。

您可以在 Chrome 122+ 或 Safari 17+ 中尝试下面的任何代码示例。

Set.prototype.union(其他)

集合的并集是包含任一集合中存在的所有元素的集合。

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const backEndLanguages = new Set(["Python""Java""JavaScript"]);

const allLanguages = frontEndLanguages.union(backEndLanguages);

// => Set {"JavaScript""HTML""CSS""Python""Java"}

在此示例中,前两组中的所有语言都在第三组中。与向 中添加元素的其他方法一样Set,重复项将被删除。

这相当于FULL OUTER JOIN两个表之间的 SQL。

JS集合中的并集、交集、差集

Set.prototype.intersection(其他)

交集是包含两个集合中存在的所有元素的集合。

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const backEndLanguages = new Set(["Python""Java""JavaScript"]);

const frontAndBackEnd = frontEndLanguages.intersection(backEndLanguages);

// => Set {"JavaScript"

“JavaScript”是这里两个集合中唯一存在的元素。

JS集合中的并集、交集、差集

Set.prototype.difference(其他)

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const backEndLanguages = new Set(["Python""Java""JavaScript"]);

const onlyFrontEnd = frontEndLanguages.difference(backEndLanguages);

// => Set {"HTML""CSS"

const onlyBackEnd = backEndLanguages.difference(frontEndLanguages);

// => Set {"Python""Java"}

在查找集合之间的差异时,重要的是您在哪个集合上调用函数以及哪个集合是参数。在上面的示例中,从前端语言中删除后端语言会导致“JavaScript”被删除并在结果集中返回“HTML”和“CSS”。然而,从后端语言中删除前端语言仍然会导致“JavaScript”被删除,并返回“Python”和“Java”。

差异就像执行LEFT JOIN.

JS集合中的并集、交集、差集

交叉点就像一个INNER JOIN.

Set.prototype.symmetryDifference(其他)

两个集合之间的对称差异是一个集合,该集合包含两个集合之一中的所有元素,但不包含两个集合中的所有元素。

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const backEndLanguages = new Set(["Python""Java""JavaScript"]);

const onlyFrontEnd = frontEndLanguages.symmetricDifference(backEndLanguages);

// => Set {"HTML""CSS""Python""Java"

const onlyBackEnd = backEndLanguages.symmetricDifference(frontEndLanguages);

// => Set {"Python""Java""HTML""CSS"}


在这种情况下,结果集中的元素是相同的,但请注意顺序不同。集合顺序由元素添加到集合的顺序决定,并且执行该函数的集合将首先添加其元素。

对称差异类似于 FULL OUTER JOIN,排除两个表中的任何元素。

JS集合中的并集、交集、差集

Set.prototype.isSubsetOf(其他)

如果第一个集合中的所有元素都出现在第二个集合中,则一个集合是另一个集合的子集。

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const declarativeLanguages = new Set(["HTML""CSS"]);

declarativeLanguages.isSubsetOf(frontEndLanguages);

// => true

frontEndLanguages.isSubsetOf(declarativeLanguages);

// => false

集合也是其自身的子集。

frontEndLanguages.isSubsetOf(frontEndLanguages);

// => true

Set.prototype.isSupersetOf(其他)

如果第二个集合中的所有元素都出现在第一个集合中,则一个集合是另一个集合的超集。这是子集的相反关系。

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const declarativeLanguages = new Set(["HTML""CSS"]);

declarativeLanguages.isSupersetOf(frontEndLanguages);

// => false

frontEndLanguages.isSupersetOf(declarativeLanguages);

// => true

集合也是其自身的超集。

frontEndLanguages.isSupersetOf(frontEndLanguages);

// => true

Set.prototype.isDisjointFrom(其他)

const frontEndLanguages = new Set(["JavaScript""HTML""CSS"]);

const interpretedLanguages = new Set(["JavaScript""Ruby""Python"]);

const compiledLanguages = new Set(["Java""C++""TypeScript"]);

interpretedLanguages.isDisjointFrom(compiledLanguages);

// => true

frontEndLanguages.isDisjointFrom(interpretedLanguages);

// => false

这些集合中的解释语言和编译语言不重叠,因此这些集合是不相交的。前端语言和解释语言确实与“JavaScript”元素重叠,因此它们并不是不相交的。


原文始发于微信公众号(阿勇学前端):JS集合中的并集、交集、差集

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/248517.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!