我在一个node.js应用程序中使用JavaScript ES6功能:
class pairKey {
constructor(x_pos, y_pos) {
this._X = x_pos;
this._Y = y_pos;
}
get x() {
return this._X;
}
set x(x_pos) {
this._X = x_pos;
}
get y() {
return this._Y;
}
set y(y_pos) {
this._Y = y_pos;
}
var allElem = new Map();
allElem.set(new pairKey(1,2), 'a');
allElem.set(new pairKey(2,3), 'b');
console.log(allElem.has(new pairKey(1,2))); //Should return true instead return false
字符串
在这段代码中,我想使用一对Int
作为我的map(allElem
)的键。
问题是我不知道Map
在JavaScript中如何比较对象。
有人能帮我吗?
4条答案
按热度按时间zfycwa2u1#
Map
使用 SameValueZero 算法来比较键。这意味着引用相等用于对象,所以如果你有a = new PairKey(1, 2)
和b = new PairKey(1, 2)
,它们不是同一个对象-a !== b
。那么你能做些什么来解决这个问题呢?基本上有两种方法来解决这个问题:
new PairKey
在使用相同参数调用时总是返回相同的对象你也可以继承
Map
,所有的方法都被覆盖,这样它们就可以专门处理PairKey
,依赖于上面的一种技术。不幸的是,散列consing不可能在没有弱引用和不泄漏内存的情况下实现,所以我们必须求助于第一种技术:
字符串
fcwjkofz2#
代码失败的原因是Map使用同值算法来匹配键。一个对象示例与另一个对象示例的值不同,即使两者共享相同的内在值(例如,try
({a:1} === {a:1})
-> it's false)。一种方法是为对象添加一个键属性,使相同的内部值生成完全相同的键(1到1)。然后在设置Map条目时使用该键。参见示例(利用Symbol.for
生成可再现键):字符串
c9qzyr3d3#
你的map键是一个对象。
console.log
返回false
,因为你正在创建一个新对象来检索它们的键。它是否具有相同的对并不重要。重要的是它是一个不同的新对象。如果你想检索对应于
new pairKey(1,2)
的值,你必须执行以下操作:字符串
换句话说,如果使用object作为键,请确保使用相同的对象来检索值。
kninwzqo4#
我很抱歉提出了这个老问题,但我发现了一个非常有趣的解决方案,灵感来自Bergi's answer和hash consing被认为是不可能的。
字符串
一个类似的解决方案,更多的静态的东西:
型