解决方法:将对象作为键的javascript字典

时间:2010-07-27 15:56:05

标签: javascript dictionary hashtable

我读了一些关于javascript字典实现的问题和答案,但它们不符合我的要求:

  • 字典必须能够将对象作为键
  • 值必须由[] -operator
  • 访问

所以我想出了在Object.prototype中覆盖“valueOf”方法的想法,如下所示:


   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方法在整个代码中没有用于其他目的,你认为有任何缺点吗?

3 个答案:

答案 0 :(得分:5)

这是一个有趣的想法。我建议我jshashtable。它符合您的第一个要求,但不是第二个要求。我没有看到坚持使用方括号属性访问符号的优点:你对它有特殊要求吗?

使用jshashtable,您可以为Hashtable构造函数提供散列函数。该函数传递一个要用作键的对象,并且必须返回一个字符串;您可以使用与您所拥有的功能不同的功能,而无需触摸Object.prototype

您的想法存在一些缺点:

  1. 您的valueOf方法将在for...in循环中显示在任何原生对象上;
  2. 您无法确定哪些键应该被视为相等,这是您可能想要做的事情。相反,所有密钥都将被视为唯一。
  3. 这不适用于主机对象(即环境提供的对象,例如DOM元素)

答案 1 :(得分:2)

这是一个有趣的问题,因为我到目前为止假设任何对象都可以用作索引(但从未尝试使用关联数组)。我不太了解JavaScript的内部工作原理,但我敢打赌,valueOf在某些地方使用其他,即使不在你的代码中也是如此。您可能会在以后遇到看似无法解释的问题。至少,我将自己局限于一个新的类并保留对象;)或者,你显式调用你的哈希函数,调用它myHash()或其他什么并调用z [x.myHash()]这会增加混乱,但会让我,个人而言,睡得更好;)我无法抗拒地认为有更多的JavaScript感知解决方案,所以考虑所有这些丑陋的解决方法;)

答案 2 :(得分:0)

如果您遇到这个问题,寻找一个JS字典,其中对象是关键字,请查看地图Map vs Object in JavaScript