jshashtable无法识别等效键

时间:2011-10-06 14:24:39

标签: javascript

我正在使用Tim Down的jshashtable.js。我正在使用以下Key对象填充两个不同的哈希表,该对象实现了hashCode()和equals():

function Key(did, oId){     
    this.dId = dId; 
    this.oId = oId;         

    this.hashCode = function(obj) {
    //alert("hashCode: " + this.dId+"-"+this.oId);
       return this.dId+"-"+this.oId;
    }

    this.equals = function(obj) {
    //alert("obj.dId: "+ obj.dId + " this.dId: " + this.dId + "\nobj.oId: " + obj.oId + " this.oId: " + this.oId);
    //alert("dId compare: " + obj.dId == this.dId + " oId compare: " + obj.oId == this.oId);
    alert("obj instanceof Key: " + obj instanceof Key);
    return (obj instanceof Key) &&
       (obj.dId == this.dId) &&
       (obj.oId == this.oId);
    };
}

然后我迭代一个哈希表并使用containsKey()来判断这个键是否存在于我正在迭代的哈希表中,并根据返回的布尔值添加新的键/值对来自containsKey()。我看到的问题是虽然hashCode()方法警告相同的字符串,但是对象equals()返回false,因此它总是认为它有一个新的Key。

我尝试使用文字字符串作为键也dId +' - '+ oId,我认为它也应该起作用。如果没有,我尝试使用hashCode()和equals()这个对象似乎也不起作用。

也许值得注意的是oId可能是一个字符串“5”或一个数字5.但是,我认为由于Javascript没有强类型,这种差异无关紧要 - 特别是因为,当与dId +连接时' - '它应该成为一个字符串。

关于比较原因似乎不起作用的任何想法? 提前致谢

1 个答案:

答案 0 :(得分:0)

您发布的代码中存在两个小问题:

  • 函数声明中的第一个参数应该是dId而不是did,但我认为这里的示例必须是拼写错误,因为此处的代码会在Key时立即抛出叫;
  • alert("obj instanceof Key: " + obj instanceof Key);具有误导性:它会提醒false,因为运营商优先级会使其有效("obj instanceof Key: " + obj) instanceof Key

除此之外,我找不到问题,似乎有效:

var h = new Hashtable();
var k1 = new Key(5, 6), k2 = new Key("5", "6");
h.put(k1, 1);
h.put(k2, 2);

alert(h.keys().length);

...警告1,正如所料。