首页/文章/javascript

JavaScript Set有新功能啦,子、交、并、补轻松搞定

2024-09-09
13565 分钟
...

背景

本文是一篇翻译文章,看到原文《Union, intersection, difference, and more are coming to JavaScript Sets》感觉内容非常不错,而且前端也会用到集合的计算,就决定翻译并整理一下。内容顺序跟原文有所出入,按印象中数学集合的定义进行整理的。

JavaScript Set 添加新功能了,子、交、并、补轻松搞定,一起来看看!

引言

JavaScript Set 是在 ES2015 规范中被引入的集合结构,但是它的功能并不完整:

  1. 创建

除此之外想要实现集合的其他功能,如计算子集、交集等,就需要自定义函数来实现。幸运的是,基于 ECMAScript 规范的 TC39 和浏览器已经支持了集合的交集和并集这些新功能。

JavaScript Set 在ES2015 中的功能

第一,集合类的创建:

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

第二,打印集合的大小:

languages.size; 

第三,添加元素:

languages.add("JavaScript");
languages.add("CSS");
languages.size; 

第四,删除元素:

languages.delete("TypeScript");
languages.size; 

第五,校验元素是否存在:

languages.has("JavaScript");// => true
languages.has("TypeScript");// => false

第六,遍历集合元素:

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

第七,清空集合:

languages.clear();
languages.size;

在浏览器里面控制台输入上面的代码,小测一下的结果:

集合功能适用场景:

  1. 处理不重复数据值。
  2. 高效校验集合中是否存在某元素。
  3. 从 Array 或其他迭代类型转换为集合并去重。

对于更复杂的集合计算功能,我们之前只能自己写函数了。为什么对这个文章感兴趣呢?因为上个月刚好写过两个集合的交集的实现。有了新功能,就不用费劲吧啦的自己写了!

集合的新功能

Set 增加了下列新方法:

  1. 子,isSubsetOf/isSupersetOf/isDisjointFrom
  2. 交,intersection
  3. 并,union
  4. 补,difference/symmetricDifference

在谷歌 Chrome 122+ 或 Safari 17+ 浏览器里面可用测试这些新功能。

子集

  1. isSubsetOf 方法用来测试某个集合的元素是否全部包含在另一个集合中;
  2. 反向操作 isSupersetOf,某集合包含另一个集合的全部元素;
  3. isDisjointFrom,一个集合和另一个集合是否存在公共元素,注意是 Disjoint 不存在公共元素返回真。
const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"]);
const declarativeLanguages = new Set(["HTML", "CSS"]);
console.log(declarativeLanguages.isSubsetOf(frontEndLanguages)); 
console.log(frontEndLanguages.isSubsetOf(declarativeLanguages));
console.log(declarativeLanguages.isSupersetOf(frontEndLanguages)); 
console.log(frontEndLanguages.isSupersetOf(declarativeLanguages));

const interpretedLanguages = new Set(["JavaScript", "Ruby", "Python"]);
const compiledLanguages = new Set(["Java", "C++", "TypeScript"]);
console.log(interpretedLanguages.isDisjointFrom(compiledLanguages));
console.log(frontEndLanguages.isDisjointFrom(interpretedLanguages));

测试结果:

交集

Set.prototype.intersection(other) 方法求两个集合的交集:

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"])
const backEndLanguages = new Set(["Python", "Java", "JavaScript"])
const frontAndBackEnd = frontEndLanguages.intersection(backEndLanguages)

测试结果:

并集

Set.prototype.union(other) 方法求两个集合的并集:

const frontEndLanguages = new Set(["JavaScript", "HTML", "CSS"])
const backEndLanguages = new Set(["Python", "Java", "JavaScript"])
const allLanguages = frontEndLanguages.union(backEndLanguages)

测试结果:

补集

  1. 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"}
console.log(onlyFrontEnd);
console.log(onlyBackEnd);

测试结果:

  1. symmetricDifference,全集中除去交集部分:

测试代码:

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"}
console.log(onlyFrontEnd);
console.log(onlyBackEnd);

测试结果,全集相同的话,不同集合调用此方法的结果相同:

支持状况

As of writing this, the proposal stands at stage 3 in TC39's process and Safari 17 (released in September 2023) and Chrome 122 (February

  1. have shipped implementations of these methods. Edge follows Chrome closely and Firefox Nightly has support behind a flag, I would expect both of these browsers to ship support soon too.

我测试的时候本机谷歌浏览器版本是128,是直接可用的。上个月写一个筛选公共字段的前端功能,还是自己费劲实现的。如果所有浏览器都支持的话,一行调用就可以搞定了,还是挺轻松的!

待到那时,前端程序员再也不会感到 Set 集合不完整了!

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
javascript2025-09-18
JavaScript 的多线程能力:Worker
如果你写过一些计算量稍大的 JavaScript 代码,比如图像处理、大量数据排序或者复杂的算法,你几乎肯定遇到过浏览器“卡死”的现象。点击页面没反应,动画也停了,就像整个世界都静止了。 这就是主线程被阻塞的典型后果。因为主线程既要负责执行 JavaScript,又要负责渲染页面、响应用户操作,一旦它被繁重的计算任务占满,就无暇顾及其他,用户体验便直线下降。 这个问题的根源,正是“主线程是单线程的”。那么,如何解决呢? 答案很简单:把这...
学习面试
javascript2025-09-10
手把手教你实现一个EventEmitter
你是不是也遇到过这种情况:代码里各种事件监听和触发,回调函数套了一层又一层,最后自己都理不清哪个事件先触发、哪个后触发了? 别担心,今天我就带你从零开始实现一个自己的事件触发器(EventEmitter),让你彻底掌握事件驱动的精髓,代码清晰度直接提升200%! 为什么要懂EventEmitter? 先说说为什么我们要关心这个。Node.js的核心就是事件驱动,比如文件读写、网络请求,都是通过事件来处理的。不会EventEmitter,...
学习面试
javascript2025-08-09
Web Worker 多线程魔法
你是否曾遇到过网页因为复杂计算而卡顿的情况?今天,让我们一起探索Web Worker的神奇世界,看看如何用多线程技术解决性能瓶颈,并实现流畅的图片压缩功能! 为什么需要Web Worker? 想象一下,你在一个繁忙的餐厅里,只有一位服务员(主线程)负责点餐、上菜、结账所有工作。当客人突然暴增时,这位服务员就会手忙脚乱,其他客人只能干等着… 这就是JavaScript的现状—— 单线程 !所有任务都在一个线程中排队执行,一旦遇到复杂计算(...
学习面试
javascript2025-08-07
🌐AST抽象语法树
AST 是前端开发中一个非常重要的概念,它就像是代码的“编译器”,能够帮助我们理解和操作代码。本文将深入探讨 AST 的原理和应用,带你从零开始了解 AST。 一、什么是 AST? AST(抽象语法树)是一种树形结构,用于表示程序代码的语法结构。它将代码分解为一系列的节点,每个节点代表代码中的一个元素,如变量、函数、表达式等。AST 是编译器和解释器的基础,也是代码分析和转换的关键工具。 1\. AST 的结构 AST 的结构通常包括以...
学习面试
javascript2025-08-05
打字机效果是如何实现的
分析效果 使用 AI 对话的时候,文字是一个字一个字蹦出来的?它不是等所有内容生成完毕后一次性展示,而是以一种流畅、实时的“打字机”效果呈现,这种体验的背后,隐藏着一种高效的Web技术。它就是 服务器推送事件(Server Sent Events,简称 SSE) 什么是 SSE 从根本上说,SSE 是一种允许服务器 单向 、 持续 地向客户端(浏览器)推送数据的Web技术。 可以把它想象成一个 电台广播 : 服务器 是广播电台,持续不断...
学习面试
javascript2025-08-04
Promise 从原理到实现
前言 是 异步编程的核心概念之一,它为我们提供了一种更优雅的方式来处理异步操作。 本文将全面剖析 的工作原理,并逐步实现一个符合 规范的 。 正文 一、Promise 基础概念 代表一个异步操作的最终完成(或失败)及其结果值。它有 种状态: 1. pending : ,既不是成功,也不是失败状态 2. fulfilled :意味着操作 完成 3. rejected :意味着操作 状态一旦改变就不能再变,只能从 变为 ,或从 变为 。 二...
学习面试

评论

请登录后发表评论

去登录
加载评论中...

目录