解决方法:将对象作为键的javascript字典
我读了一些关于javascript字典实现的问题和答案,但它们不符合我的要求:解决方法:将对象作为键的javascript字典,javascript,dictionary,hashtable,Javascript,Dictionary,Hashtable,我读了一些关于javascript字典实现的问题和答案,但它们不符合我的要求: 字典必须能够将对象作为键 这些值必须可由[]-运算符访问 所以我想到了覆盖Object.prototype中的“valueOf”-方法,如下所示: Object.__id__ = 0; Object.prototype.valueOf = function() { if(!this.__id__) this.__id__ = ++Object.__id__;
- 字典必须能够将对象作为键
- 这些值必须可由[]-运算符访问
Object.__id__ = 0;
Object.prototype.valueOf = function() {
if(!this.__id__)
this.__id__ = ++Object.__id__;
return "__id__" + this.__id__;
}
Object.prototype.toString = Object.prototype.valueOf;
//test
var x = {p1: "5"};
var y = [6];
var z = {};
z[x] = "7";
z[y] = "8";
console.log(z[x], z[y]);
我用google chrome测试了它,它似乎工作得很好,但我有点怀疑,这是否会导致一些缺点,因为它很容易实现
考虑到valueOf方法在整个代码中没有用于其他目的,您认为有任何缺点吗?这是一个有趣的问题,因为到目前为止,我假设任何对象都可以用作索引(但从未尝试使用关联数组)。我不太清楚JavaScript的内部工作原理,但我敢打赌valueOf在其他地方被JavaScript使用,即使不是在您的代码中。你以后可能会遇到看似无法解释的问题。至少,我会限制自己使用一个新类,而不使用对象;)或者,显式地调用散列函数,调用它myHash()或其他任何函数,然后调用z[x.myHash()],这会增加混乱,但会让我个人睡得更好;)我无法抗拒认为有更多的JavaScript意识到的解决方案,所以考虑所有这些丑陋的解决方案;p> 这是一个有趣的想法。我建议我的建议。它满足您的第一个要求,但不满足第二个要求。我并不认为坚持使用方括号属性访问符号有什么好处:您对它有特殊要求吗 使用jshashtable,您可以向
Hashtable
构造函数提供散列函数。此函数被传递一个要用作键的对象,并且必须返回一个字符串;您可以使用与现有功能相同的功能,而无需触摸Object.prototype
你的想法有一些缺点:
valueOf
方法将在任何本机对象上的for…in
循环中显示李>
如果你在寻找一本以对象为键的JS字典时遇到了这个问题,请查看地图我以前一直使用过你的库,它运行良好。但目前我正在开发一个ActionScript3到Javascript的转换器。AS3提供了一个字典。如果我使用你的库,我需要检查类型并用get/set替换括号。如果我使用对象,则value of不会出现在for…中,但如果我定义了一个新的“类”,则会出现。(在其他浏览器中,这种行为可能有所不同)。因为我不喜欢覆盖Object.prototype.valueOf本身,所以您回答了我的问题