- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
新 ES 6 (Harmony) 引入了新的 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将记录和元组(基本上是不可变的对象和数组)添加到 Javascript。在该提案中,它使用 ===
或 !==
提供了记录和元组的直接比较,它比较值,而不仅仅是对象引用,并且与此答案相关 Set
和 Map
对象将在键比较/查找中使用 Record 或 Tuple 的值,这将解决这里所要求的问题。
由于 Records 和 Tuples 是不可变的(不能被修改)并且因为它们很容易通过值(通过它们的内容,而不仅仅是它们的对象引用)进行比较,它允许 Maps 和 Sets 使用对象内容作为键和提议的规范明确命名了 Sets 和 Maps 的此功能。
这个原始问题要求 Set 比较的可定制性,以支持深度对象比较。这并没有提出 Set 比较的可定制性,但如果您使用新的 Record 或 Tuple 而不是 Object 或 Array,它直接支持深度对象比较,从而解决这里的原始问题。
请注意,该提案已于 2021 年年中进入第 2 阶段。它最近一直在向前推进,但肯定没有完成。
可以跟踪 Mozilla 在这个新提案上的工作 here .
原始答案
ES6 Set
对象没有任何比较方法或自定义比较扩展性。
.has()
、.add()
和 .delete()
方法仅在相同的实际对象或原语的相同值,并且没有办法插入或替换该逻辑。
您大概可以从 Set
派生您自己的对象并替换 .has()
、.add()
和 。 delete()
方法与首先进行深度对象比较以查找该项目是否已经在 Set 中的东西,但性能可能不会很好,因为底层 Set
对象不会提供帮助。在调用原始 .add()
之前,您可能需要对所有现有对象进行暴力迭代,以使用您自己的自定义比较找到匹配项。
这是来自 this article and discussion 的一些信息ES6 特性:
5.2 Why can’t I configure how maps and sets compare keys and values?
Question: It would be nice if there were a way to configure what mapkeys and what set elements are considered equal. Why isn’t there?
Answer: That feature has been postponed, as it is difficult toimplement properly and efficiently. One option is to hand callbacks tocollections that specify equality.
Another option, available in Java, is to specify equality via a methodthat object implement (equals() in Java). However, this approach isproblematic for mutable objects: In general, if an object changes, its“location” inside a collection has to change, as well. But that’s notwhat happens in Java. JavaScript will probably go the safer route ofonly enabling comparison by value for special immutable objects(so-called value objects). Comparison by value means that two valuesare considered equal if their contents are equal. Primitive values arecompared by value in JavaScript.
关于javascript - 如何为 JavaScript Set 自定义对象相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29759480/
我在 Mac OsX 10.11 上使用 Xcode 7.0.1 (7A1001) 我使用 carthage 0.9.2 通过以下购物车文件下载reactivecocoa github“Reactiv
我正在将一个对象从属性“模型”(我从 Laravel 中的 Blade 属性模型中获得)分配给数据属性模型。后来数据属性模型发生变化,因为它绑定(bind)到表单输入字段。但 Prop “模型”也发生
当我更新数组内对象的属性然后作为组件的 Prop 传递时,在 svelte 中触发 react 性的正确方法是什么? let items = [{ id: 1, name: 'first'
我是 DRY principle 的坚定拥护者: Every piece of knowledge must have a single, unambiguous, authoritative rep
我正在实现一个需要以下功能的线程: 及时响应终止请求 推送消息 在等待消息时保持对 SendMessage 请求的响应 我对消息泵的初始实现使用了 GetMessage,如下所示: while not
在我的应用程序中,用户获得了一份已到达她的文档列表,并且可以对每个文档执行操作。 文件是分批提交的,当这种情况发生时,列表会增加。这一切都很好,这是预期的行为,但最好有一个按钮“暂停实时数据”,它会忽
我有一个属性为 的数据对象 displaySubtotal 我可以通过以下方式更新该属性的值: data.displaySubtotal = numPad.valueAsAString(); 我的方法
我需要一个垂直 slider 输入。由于内置的 sliderInput 函数无法做到这一点,因此我选择自己实现。根据this thread可以 (I) 使用 CSS 旋转 sliderInput
我正在从自定义用户权限管理系统迁移到 Alanning:roles v2.0 .我有一个非常基本的结构: 基本用户 用户组,每个用户组都有特定的设置。我将它们存储在一个“组”集合中。 管理群组的用户的
Shiny 中的响应式(Reactive)表达式将更改传播到需要去的地方。我们可以使用 isolate 来抑制一些这种行为。 ,但是我们可以抑制基于我们自己的逻辑表达式传播的更改吗? 我给出的例子是一
是否有(或可能有) react 性 Parsec (或任何其他纯函数式解析器)在 Haskell 中? 简而言之,我想逐个字符地为解析器提供数据,并获得与我提供的足够多的结果一样多的结果。 或者更简单
HTML(JADE) p#result Lorem ipsum is javascript j s lo 1 2 4 this meteor thismeteor. meteor input.sear
我有一个被导入函数更改的对象。 https://svelte.dev/repl/e934087af1dc4a25a1ee52cf3fd3bbea?version=3.12.1 我想知道如何使我的更改反
我有一个YUV 420半平面格式的图像,其中字节以这种方式存储: [Y1 Y2 ... [U1 V1.... Yk Yk+1...] Uk' Uk'+1] 其中Y平面的大小是UV平面的两倍,并
如何使用 ReactiveCocoa 订阅从 NSMutableDictionary 添加和删除的对象?另外,我想在它发生变化时广播通知。我的猜测是可以使用 RACMulticastConnectio
我正在构建一个带有多个选项卡的应用程序,其中一些选项卡涉及过多的计算,而另一些选项卡的计算速度很快。一个允许用户在 react 性或手动更新之间进行选择的复选框,与“刷新”按钮结合使用,将是理想的选择
我知道您可以在获取集合时使用 reactive: false 关闭 react 性。如何在内容可编辑区域内的集合字段中实现相同的效果?示例: Template.documentPage.events(
我想在 z3 中表示一个哈希函数,比如 SHA(x)。在做了一些研究之后,似乎 z3 不能很好地支持注入(inject)性,所以我不能有像这样的约束(虽然我意识到这并不是严格意义上的碰撞,但作为一种启
我正在解决一个问题,我想在仪表板中将数据显示为图表(通过 perak:c3 )和表格(通过 aslagle:reactive-table )。我的问题是数据是从 MongoDB 中的集合中提取的,它的
我的 ViewModel 中有这个函数,它返回一个信号,但内部 block 不起作用,我尝试添加断点,但它没有中断。这是我的代码。 func executeLoginAPI() -> RACSigna
我是一名优秀的程序员,十分优秀!