如何为 JavaScript Set 自定义对象相等性

2024-01-19

新ES 6(Harmony)推出新Set https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set目的。 Set 使用的恒等算法类似于===运算符,因此不太适合比较对象:

var set = new Set();
set.add({a:1});
set.add({a:1});
console.log([...set.values()]); // Array [ Object, Object ]

如何自定义 Set 对象的相等性以进行深度对象比较?有没有类似Java的东西equals(Object)?


更新 3/2022

目前有一个proposal https://github.com/tc39/proposal-record-tuple#usage-in-mapsetweakmapweakset将记录和元组(基本上是不可变的对象和数组)添加到 Javascript。在该提案中,它提供了使用记录和元组的直接比较=== or !==它比较值,而不仅仅是对象引用并且与此答案相关Set and Map对象将使用value关键比较/查找中的记录或元组的信息,这将解决此处所要求的问题。

由于记录和元组是不可变的(无法修改),并且它们很容易通过值进行比较(通过它们的内容,而不仅仅是它们的对象引用),因此它允许映射和集合明确地使用对象内容作为键和建议的规范将此功能命名为“集合”和“地图”。

这个原始问题要求设置比较的可定制性,以支持深度对象比较。这并不建议 Set 比较的可定制性,但如果您使用新的 Record 或 Tuple 而不是 Object 或 Array,它会直接支持深度对象比较,从而解决这里的原始问题。

请注意,该提案于 2021 年中期进入第二阶段。最近一直在推进,但肯定还没有完成。

可以追踪 Mozilla 在这项新提案上的工作here https://bugzilla.mozilla.org/show_bug.cgi?id=1658309.


原答案

The ES6 Set对象没有任何比较方法或自定义比较扩展性。

The .has(), .add() and .delete()方法仅在与原语相同的实际对象或相同的值时起作用,并且没有办法插入或替换该逻辑。

你大概可以从一个派生你自己的对象Set并替换.has(), .add() and .delete()方法首先进行深度对象比较以查找该项目是否已在集合中,但性能可能不会很好,因为底层Set对象根本没有帮助。在调用原始对象之前,您可能必须对所有现有对象进行强力迭代,以使用您自己的自定义比较来查找匹配项.add().

这里有一些信息来自这篇文章和讨论 http://www.2ality.com/2015/01/es6-maps-sets.htmlES6 特性:

5.2 为什么我无法配置映射和集合如何比较键和值?

问题:如果有一种方法可以配置什么地图就好了 键以及哪些集合元素被认为是相等的。为什么不存在?

答:该功能已被推迟,因为很难 正确有效地实施。一种选择是将回调传递给 指定相等性的集合。

Java 中可用的另一个选项是通过方法指定相等性 该对象实现(Java 中的 equals())。然而,这种方法是 可变对象的问题:一般来说,如果一个对象发生变化,它的 集合中的“位置”也必须改变。但那不是 Java 中会发生什么。 JavaScript 可能会走更安全的路线 仅对特殊的不可变对象启用按值比较 (所谓的值对象)。按值比较意味着两个值 如果它们的内容相等,则认为它们相等。原始值是 在 JavaScript 中按值进行比较。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 JavaScript Set 自定义对象相等性 的相关文章

  • 禁用内容安全策略

    当我开发网站时 我经常想看看特定功能在网站上的外观如何 所以我会使用 chrome 开发者工具并经常运行一些 javascript 脚本 我经常发现一些脚本由于内容安全策略 CSP 而无法运行的问题 我完全理解该策略是为了防止跨站点脚本攻击
  • 我如何在 AngularJS 中监听点击并按住的情况?

    我制作了一个时间计数器 您可以通过单击按钮来增加或减少时间 然而 我希望当我单击并按住按钮时 时间的价值会不断攀升 所以目前如果你看到我的Plunkr http plnkr co edit BxX9x5zYFMXVqt5JsN1F p pr
  • React-native:将场景绑定到导航栏

    我正在整理这个提问 回答应用程序 并遇到了这个障碍 我想从导航栏触发场景中的功能 与登录应用程序类似 我在导航栏中有一个用于提交答案的按钮 RightButton route navigator index navState if rout
  • 访问sendBeacon发送的数据

    文档表明sendBeacon通过发送其数据HTTP POST request 但在 PHP 中 POST变量似乎是一个空数组 这是我的 JavaScript 代码 navigator sendBeacon beacon log php My
  • 如何使用 selenium 和 Mocha 获取 xPath() 选择的锚标记的文本

    我已经成功选择了 a 标签 我想显示锚标记的文本 但无法这样做 我正在使用 selenium mocha javascript 和 phantomJS 这是我的脚本 详细 var assert require assert var test
  • 用隐藏单元格补充 colspanned 表格有什么不好吗?

    我一直在表格上开发一些排序和选择功能 我发现在具有跨单元格的表格中定位非常困难 我只是添加了跨区单元格并将其隐藏 它看起来不错 它与我的 js 一起工作 非常适合索引 但我想知道这是否是合法的方法 stuffing display none
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • 即使我可以监视其他方法,也无法监视事件处理程序

    我想使用 Jest Jasmine Enzyme 测试 React 中的事件处理程序 MyComponent js import React from react class MyComponent extends React Compon
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • 如何流式传输 OpenAI 的完成 API?

    我想流式传输结果通过 OpenAI 的 API 完成 https beta openai com docs api reference completions 该文档提到使用服务器发送的事件 https developer mozilla
  • 是否有任何非轮询方式来检测 DOM 元素的大小或位置何时发生变化?

    很长一段时间以来 我一直在寻找一种方法来检测 DOM 元素的大小或位置何时发生变化 这可能是因为窗口调整了大小 或者因为向该元素添加了新的子元素 或者因为在该元素周围添加了新元素 或者因为 CSS 规则已更改 或者因为用户更改了浏览器的字体
  • 使用 JS 合并具有相同值的相邻 HTML 表格单元格

    我已经为此苦苦挣扎了一段时间 我有一个根据一些 JSON 数据自动生成的表 该数据可能会有所不同 我想合并第一列中具有相同值的相邻单元格 例如此表中的 鱼 和 鸟 table tr td fish td td salmon td tr tr
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • Nodejs mysql 获取正确的时间戳格式

    我在用着mysqljs https github com mysqljs mysql得到结果后sql我变得不同TimeStamp格式如下 created at Sat Jul 16 2016 23 52 54 GMT 0430 IRDT 但
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • Jquery - 通过在字符串中构建 id 的 id 获取元素

    我在使用 jquery 元素时遇到问题 我正在 var 中构造名称 例如 var myId myGotId myId attr title changed myId 返回空 我想通过 id 获取我的元素 但动态构建我的 Id 连接字符串 编
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • 无法中断 lock.acquire() 而我可以中断 time.sleep()

    在 Windows 中 Python 3 4 import threading l threading Lock l acquire l acquire 触发死锁 并且 CTRL C 无法阻止它 你必须杀死该进程 另一方面 import t
  • 如何执行 UITableViewCell 的自定义移动?

    我想像这两种方法一样移动单元格 void tableView UITableView tableView moveRowAtIndexPath NSIndexPath fromIndexPath toIndexPath NSIndexPat
  • gensim word2vec - 使用在线词嵌入更新数组维度

    gensim 0 13 4 1 中的 Word2Vec 无法动态更新词向量 model build vocab sentences update False 工作正常 然而 model build vocab sentences updat
  • Rails 3 模型将某些列映射到不同的模型属性

    我有一个名为 DXFTACCTS 的旧旧表 并且创建了 Rails 模型 Account class Account lt ActiveRecord Base set table name DXFTACCTS end 问题是 DXFTACC
  • Python——函数不返回值

    我想编写一个函数来比较两个值 val1和val2 如果val1大于val2 则为a points添加1分 像A队一样 反之亦然 如果val2更大 则为b points添加1分 如果这两个值是偶数 我不会向 a points 或 b poin
  • NDK/JNI:识别当前线程

    在JNI本地方法中 有没有一种方法可以在不回调Java的情况下知道当前线程的ID 线程本地存储也可以工作 编辑 pthread h 存在于 NDK 包含文件夹中 有谁知道 Java 线程是否对应于 NDK 实现中的 POSIX 线程 您对哪
  • 在编译过程中如何查看解析树、中间代码、优化代码和汇编代码?

    我正在学习编译器课程 程序的编译遵循以下步骤 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成 如何查看每个步骤的输出 例如我想在语法分析后查看解析树 我正在使用 GCC 编译器在 Linux 机器上编译程序 我们可以使用
  • Gitlab-CI 中的上游触发(又名管道依赖项)

    我似乎无法从这样的工具中找到最明显的 CI 功能 在另一个项目的管道完成后运行项目管道 你可以这样做trigger但仅适用于下游触发 这与您想要的相反 如果您有一个项目是 20 个其他项目的核心依赖项 而这些项目都需要重建 在这种情况下 您
  • 如何在 python 上解决 TISE 的简单边值问题

    我正在尝试求解无限势阱的 TISEV 0在间隔上 0 L 这个练习给我们提供了波函数及其导数的值0 is 0 1分别 这使我们能够使用scipy integrate odeint函数来解决给定能量值的问题 现在的任务是在给定波函数的进一步边
  • “The fi bug” 一个奇怪的 iOS 7 归因文本错误

    我在 iOS 7 中遇到了一个奇怪的错误 我称之为 fi bug 抽象的 两个字符 fi 被视为一个字符 解释 我创建了一个 UILabel 其中包含一个单词 作为属性文本 我创建了一个函数 单击时会将单词的一个字符着色为蓝色 即首先单击它
  • LR(0) 解析器如何离开状态 0?

    我已经阅读了维基百科的解释至少十几次 但我仍然对 LR 0 解析器如何离开状态 0 感到困惑 维基百科的例子及其解释说 http en wikipedia org wiki LR parser Parsing Steps 解析器从仅包含初始
  • 如何在java中找到像2^(10^9)这样的数字的幂[重复]

    这个问题在这里已经有答案了 Math pow 返回一个 double 值并且只接受 int 作为参数 BigInteger 作为没有查找 BigInteger BigInteger 的函数 通过循环来完成它需要很长时间 我还有什么想念的吗
  • toggleClass() 在 Angular 4 中不起作用

    我已经添加jQuery在脚本中并使用 import as from jquery 以及 我还添加了jQuery在 HTML 文件中 But my toggleClass 功能不起作用 当我检查控制台时 没有显示任何错误 它只是空的 下面是我
  • Xamarin 表单:可以在内容页上以编程方式在 Shell 应用程序中添加选项卡

    我通过谷歌查找但找不到结果 我有一个 Shell 设置 Xamarin 表单应用程序 尽管我没有完全使用它的功能 但 xaml 文件中有一个选项卡设置 我想知道我是否可以在 shellContent 下托管一个内容页面并从 contentP
  • 一次使用共享内存的多个实例

    为了在记录程序和显示程序 不能相同 之间传输视频流 我使用共享内存 为了同步访问 我组合了一个类 它包装了一个shared memory object 一个mapped region和一个interprocess sharable mute
  • Javascript“addEventListener”事件在页面加载时触发[重复]

    这个问题在这里已经有答案了 当我运行以下脚本时 该事件始终在页面加载时触发 我不确定我在这里做错了什么 我创建了元素 在 DOM 中找到它 然后附加一个侦听器 但它总是在页面加载时触发事件 而不是在单击元素时触发事件
  • Haskell 中附加词的用例

    我一直在阅读附加语 https en wikipedia org wiki Adjoint functors在过去的几天里 当我开始从理论角度理解它们的重要性时 我想知道人们如何以及为什么在 Haskell 中使用它们 Data Funct
  • Python 在正则表达式中将 f 字符串与 r 字符串和大括号组合

    给定一个单词 x 返回可以在该单词中找到的可能的 n 元语法 您可以根据需要修改n gram值 它位于 pat 变量的花括号中 默认 n 元语法值为 4 例如 对于单词 x x abcdef 可能的 4 克是 abcd bcde cdef
  • 在 AWS Beanstalk 或 EC2 实例中设置 Django 并支持 GeoDjango

    因此 我曾一度使用 Amazon Instance 2013 09 ami 35792c5c 通过 Beanstalk 进行此操作 当时 将此 ebextension 脚本放置在 ebextensions 中的存储库根目录中时效果非常好 0
  • 如何为 JavaScript Set 自定义对象相等性

    新ES 6 Harmony 推出新Set https developer mozilla org en US docs Web JavaScript Reference Global Objects Set目的 Set 使用的恒等算法类似于