在 JavaScript 中创建 Set 的方法?

2023-12-31

在 Eloquent JavaScript 第 4 章中,通过创建对象并将值存储为属性名称、分配任意值(例如 true)作为属性值来创建一组值。要检查该值是否已包含在集合中,in使用运算符:

var set = {};

if (!'Tom' in set) { 
  set.Tom = true;
}

这是惯用的 JavaScript 吗?使用数组不是更好吗?

var set = [];

if (!'Tom' in set) { 
  set.push = 'Tom';
}

Sets https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set现在在 ES2015(又名 ES6,即 ECMAScript 6)中可用。自 2015 年 6 月以来,ES6 一直是 JavaScript 的当前标准。

ECMAScript 6 具有适用于任意对象的数据结构 Set 值,速度快并且可以正确处理 NaN。 -阿克塞尔·劳施梅尔 http://www.2ality.com/, 探索 ES6 http://exploringjs.com/

前两个例子来自阿克塞尔·劳施梅尔的 http://www.2ality.com/ book 探索 ES6 http://exploringjs.com/:

管理单个元素:

> let set = new Set();
> set.add('red')

> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false

确定 Set 的大小并清除它:

> let set = new Set();
> set.add('red')
> set.add('green')

> set.size
2
> set.clear();
> set.size
0

我会检查一下探索 ES6 http://exploringjs.com/如果您想了解有关 JavaScript 中集合的更多信息。这本书可以免费在线阅读,但是如果您想支持作者阿克塞尔·劳施梅尔博士 http://www.2ality.com/您可以花大约 30 美元购买这本书。

如果你想使用 Sets 和 ES6 现在你可以使用Babel https://babeljs.io/、ES6 到 ES5 转译器及其 polyfill。

编辑:截至 2017 年 6 月 6 日,大多数主要浏览器在其最新版本中都具有完整的 Set 支持(IE 11 除外)。这意味着如果您不关心支持旧版浏览器,您可能不需要 babel。如果您想查看不同浏览器(包括您当前的浏览器)的兼容性,请检查Kangax的ES6兼容性表 http://kangax.github.io/compat-table/es6/.

EDIT:

只是对初始化进行澄清。集合可以在其构造函数中采用任何同步迭代。这意味着它们不仅可以接受数组,还可以接受字符串和迭代器。以集合的以下数组和字符串初始化为例:

const set1 = new Set(['a','a','b','b','c','c']);
console.log(...set1);
console.log(set1.size);
const set2 = new Set("aabbcc");
console.log(...set2);
console.log(set2.size);

数组和字符串的输出是相同的。注意...set1 is the 扩展语法 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax。看起来可迭代的每个元素都被一一添加到集合中,因此由于数组和字符串都具有相同的元素,并且由于元素的顺序相同,所以创建的集合是相同的。关于集合需要注意的另一件事是,当迭代它们时,迭代顺序遵循元素插入集合中的顺序。这是迭代集合的示例:

const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
  console.log(element);
}

由于您可以使用任何 iterable 来初始化集合,因此您甚至可以使用来自 a 的迭代器生成器函数 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function*。以下是产生相同输出的两个迭代器初始化示例:

// a simple generator example
function* getLetters1 () {
  yield 'a';
  yield 'a';
  yield 'b';
  yield 'b';
  yield 'c';
  yield 'c';
}

// a somewhat more commonplace generator example
// with the same output as getLetters1.
function* getLetters2 (letters, repeatTimes) {
  for(const letter of letters) {
    for(let i = 0; i < repeatTimes; ++i) { 
      yield letter;
    }
  }
}

console.log("------ getLetters1 ------");
console.log(...getLetters1());
const set3 = new Set(getLetters1());
console.log(...set3);
console.log(set3.size);

console.log("------ getLetters2 ------");
console.log(...getLetters2('abc', 2));
const set4 = new Set(getLetters2('abc', 2));
console.log(...set4);
console.log(set4.size);

这些示例的生成器函数可以编写为不重复,但如果生成器函数更复杂,并且只要以下内容不会对性能产生太大负面影响,您就可以使用 Set 方法来帮助仅从生成器中获取不重复的值不再重复。

如果您想了解有关集合的更多信息而不阅读 Rauschmayer 博士书中的章节,您可以查看Set 上的 MDN 文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set。 MDN 还有更多迭代集合的示例,例如使用forEach并使用.keys, .values, and .entries方法。 MDN 还提供了集合并集、集合交集、集合差值、对称集差值和集合超集检查等示例。希望大多数这些操作都可以在 JavaScript 中使用,而无需构建您自己的函数来支持它们。事实上,有TC39 对新 Set 方法的提案 https://github.com/tc39/proposal-set-methods如果提案达到第 4 阶段,希望在未来某个时间点将以下方法添加到 JavaScript 中的 Set 中:

  • Set.prototype.intersection(iterable) - 方法通过集合交集操作创建新的 Set 实例。
  • Set.prototype.union(iterable) - 方法通过集合联合操作创建新的 Set 实例。
  • Set.prototype.difference(iterable) - 方法创建新的 Set,但不包含 iterable 中存在的元素。
  • Set.prototype.symmetryDifference(iterable) - 返回仅在 this 或 iterable 中找到的元素集。
  • Set.prototype.isSubsetOf(可迭代)
  • Set.prototype.isDisjointFrom(可迭代)
  • Set.prototype.isSupersetOf(可迭代)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中创建 Set 的方法? 的相关文章

随机推荐

  • ON 子句中另一个未知列名错误

    Query SELECT c title AS title c introtext AS body c state AS state c created AS created c created by AS uid c modified A
  • 在 Google Colab 中使用笔记本电脑网络摄像头进行实时 YOLO 对象检测

    我正在使用网络摄像头在本地系统上使用 YOLOv3 和 OpenCV 进行实时对象检测 一切都像魅力一样运作链接在这里 https github com pdhruv93 YOLO Object Detection blob master
  • CS231n:如何计算Softmax损失函数的梯度?

    我正在观看斯坦福 CS231 用于视觉识别的卷积神经网络的一些视频 但不太明白如何使用计算 softmax 损失函数的解析梯度numpy From 这个堆栈交换 https math stackexchange com questions
  • Video.js 具有空源

    无论如何 我可以放置 video js 而无需在视频标签上设置源吗 Video js 启动时没有源而失败 我想放置没有源的 video js 并从 js api 层设置源 同样的问题 但没有人回答 VideoJS 没有源码吗 https s
  • Angular PWA 不会在生产环境中更新

    我在 Angular 8 中有一个 PWA 我添加了 ng add angular pwa 并且 PWA 功能似乎可以工作 接受这个问题 当我将新版本推送到生产时 该应用程序是not在人们的浏览器上进行了更新 在 Chrome 和移动 Sa
  • 交易延长时段

    什么是 扩展会话反模式 延长 或长 会话 或每个会话的会话数 是一个可能在事务持续时间之外存在的会话 与事务范围内的会话相反 或每个请求的会话数 这不一定是反模式 这是一种实现方式长时间的谈话 即与数据库的对话跨越多个事务 这只是anoth
  • 目前进行并行下载最舒适、最可靠的跨平台 Perl 模块是什么?

    我将不得不通过简单地在 URL 上发布并获取 XML 作为回报来下载许多数据集 我可以通过一次执行多个请求来加快这一速度 但问题是 它需要在 Windows 和 Linux 上运行 所以线程和叉子都出局了 因为这纯粹是 IO 绑定的 所以我
  • 如何在 BroadcastReceiver 中添加 Snackbars?

    快捷栏通过在屏幕底部显示简短消息来提供有关操作的轻量级反馈 快捷栏可以包含一个操作 Android 还提供了一个 toast 主要用于系统消息传递 Toast 与 Snackbar 类似 但不包含操作 也不能滑出屏幕 我的问题 import
  • “auto it = unordered_map.find(key)”的推导类型?

    随着 C 11 的出现 我们有 unordered map cbegin cend 来专门返回 const iterator 的值 所以表达式 auto it unordered map cbegin 中 it 的推导类型是const it
  • 宏执行 fgets 剥离换行符

    给出以下两个要使用的语句fgets并去掉换行符 puts Enter the name fgets temp name 40 stdin temp name strcspn temp name n 0 下面的宏足以代替这个吗 define
  • 在mysql中计算5分钟间隔的平均值

    我有一张桌子log有柱子id myValue myCategory and myTimestamp 假设表是这样填充的 ID MYVALUE MYCATEGORY MYTIMESTAMP 1 10 1 2010 11 1 10 00 00
  • 如何获取所有终端节点 - r 中的权重和响应预测“ctree”

    这是我可以用来列出所有终端节点的权重的方法 但是如何添加一些代码来获取响应预测以及每个终端节点 ID 的权重 说我希望我的输出看起来像这样 以下是我迄今为止获得的重量 nodes airct unique where airct 谢谢 二叉
  • PHP 缓存 - 保存在数据库中还是创建文件更快?

    我目前正在缓存动态生成的 PHP 页面 方法是将它们保存到带有到期时间字段的数据库中 如果再次请求该页面 程序会检查是否有未过期的缓存版本的页面可供使用 并且仅在找不到页面时才重新生成该页面 这很有效 但是将缓存的页面保存为文件而不是保存到
  • ng test --code-coverage 不打印覆盖率详细信息

    当我使用运行测试时ng test code coverage我得到的代码覆盖率为未知 不确定可能出了什么问题 感谢这里的任何帮助 gt ng test code coverage 10 building modules 1 1 module
  • 在单页 Clojure Web 应用程序中使用 Friend 进行身份验证和授权

    我正在尝试将好友身份验证和授权集成到 Clojure Compojure 单页 Web 应用程序中 我有一个由 Angular 控制器支持的登录表单 该控制器使用 AJAX 针对 Web 应用程序验证用户名和密码 并获取经过身份验证的用户记
  • 如何将值从 ui-gmap-windows InfoWindow/Marker 传递到 ui-sref?

    我正在尝试使用 angular google maps 模块在 Google 地图上的 InfoWindow 内创建链接ui gmap windows 在我的 HTML 模板中 我有
  • Java逻辑运算符(&&、||)短路机制

    当我阅读一位同事的 Java 代码时 我偶然发现了一大堆 if else 语句 在这些声明中 有几 and 运算符在没有任何括号帮助的情况下互相争斗 我将这些陈述简化为 if true true false return true else
  • ASP.NET WebAPI 基本身份验证始终因 401/未经授权而失败

    尝试使用基本身份验证保护我的 ASP NET Web API 2 但总是以错误结束 401 Unauthorized Authorization has been denied for this request 下面是我的控制器和 ajax
  • 具有多个实体框架模型的单个连接字符串?

    在工作中 我们目前有一个非常大的 Web 应用程序 它连接到一个庞大的数据库 我们使用实体框架已经有一段时间了 为了让事情变得更容易 我们将数据库划分为许多实体模型 这对我们来说效果很好 但我们遇到了一个问题 由于连接字符串的元数据部分 每
  • 在 JavaScript 中创建 Set 的方法?

    在 Eloquent JavaScript 第 4 章中 通过创建对象并将值存储为属性名称 分配任意值 例如 true 作为属性值来创建一组值 要检查该值是否已包含在集合中 in使用运算符 var set if Tom in set set