如何确保`Map`或`Set` javascript集合的`has`方法按属性值比较对象?

如何确保`Map`或`Set` javascript集合的`has`方法按属性值比较对象?,javascript,collections,Javascript,Collections,我找不到关于这方面的更多信息,但据我所知,has方法来自Map和Set集合通过检查引用相等性来确定给定的映射或集合是否具有对象。但是我想通过比较对象的属性来检查它们是否相等 例如: let map = new Map(); let obj = {name: "Jack"}; map.set(obj, "myObj"); let result = map.has({name: "Jack"}); //false result为false,但对象的属性相同,因此在这种情况下,我希望has返回tru

我找不到关于这方面的更多信息,但据我所知,
has
方法来自
Map
Set
集合通过检查引用相等性来确定给定的映射或集合是否具有对象。但是我想通过比较对象的属性来检查它们是否相等

例如:

let map = new Map();
let obj = {name: "Jack"};
map.set(obj, "myObj");
let result = map.has({name: "Jack"}); //false
result
为false,但对象的属性相同,因此在这种情况下,我希望
has
返回true

在Java中,我必须重写类中的
equals
hashCode
方法来实现这样的功能。在Javascript中,我是否可以做类似的事情而不重写
has
本身

但这些物体的性质是相同的

真的吗?正如大纲所示,通常很难定义对象的标识,因为它由远不止一个键值对组成。因此,不可能为它派生一个唯一的散列以用于哈希表,这就是javascript在哈希表中使用对象引用的原因。这也是有意义的,因为你可能会遇到其他的碰撞。此外,如果更改哈希表中包含的对象,使其等于另一个对象,那么会发生什么


现在在很多情况下,您可能知道对象是如何构建的,以及如何获得其标识。想象一个拥有唯一用户名的玩家,例如:

 function Player(username, password) {
   this.username = username;
   this.password = password
 }
现在,当我们想要建立一个集合来检查用户名是否已经存在时,只使用玩家用户名而不是玩家本身是有意义的:

 const a = new Player("a", "super secret");
 const b = new Player("b", "****");
 new Set([a.username, b.username]);
或者,您可以定义一种从“玩家”属性构建唯一密钥的方法:

 Player.prototype.identity = function() {
   return this.username + "°" + this.password;
 };
因此,我们可以:

 const a = new Player("this is", "equal");
 const b = new Player("this is", "equal");
 console.log(
   a === b, // false
   a.identity() === b.identity() // true
 );

 const players = new Set([a.identity()]);
 players.has(b.identity()); // true

要么迭代映射并逐个比较,要么存储对象的JSON字符串,然后
has
按预期工作。@JonasW。谢谢,但为什么这个问题是重复的?我问的是
has
的内部,而不是两个对象的一般比较(您链接的问题讨论了这一点),Jup,
has
在内部使用相等,因此答案是same@JonasW. “has在内部使用相等”这应该是答案。为什么不将映射键设置为从对象中的唯一值派生的字符串?