gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:38:26 26 4
gpt4 key购买 nike

新 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。在该提案中,它使用 ===!== 提供了记录和元组的直接比较,它比较值,而不仅仅是对象引用,并且与此答案相关 SetMap 对象将在键比较/查找中使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com