代码之家  ›  专栏  ›  技术社区  ›  fishbone

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

  •  10
  • fishbone  · 技术社区  · 15 年前

    • 字典必须能够把对象作为键
    • 值必须可由[]-运算符访问

    
       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测试了它,它似乎运行得很好,但我有点怀疑,这是否会导致一些缺点,因为它很容易实现。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Tim Down    15 年前

    这是个有趣的主意。我建议我的 jshashtable . 它符合你的第一个要求,但不是第二个。我并不认为坚持使用方括号属性访问符号有什么好处:您对它有特殊的要求吗?

    使用jshashtable,可以为 Hashtable 建造师。这个函数被传递一个对象作为键,并且必须返回一个字符串;你可以使用一个与你所拥有的功能相同的功能,而不必触摸 Object.prototype

    你的想法有一些缺点:

    1. 你的 valueOf for...in 在任何本机对象上循环;
    2. 你没有办法决定哪些键应该被认为是相等的,这是你可能想做的事情。相反,所有键都将被认为是唯一的。
    3. 这不适用于宿主对象(即由环境提供的对象,如DOM元素)
        2
  •  2
  •   Nicolas78    15 年前

    这是一个有趣的问题,因为到目前为止,我假设任何对象都可以用作索引(但从未尝试使用关联数组)。我不太清楚JavaScript的内部工作原理,但我敢打赌valueOf是被使用的 或者使用JavaScript,即使不在代码中。你以后可能会遇到一些看似莫名其妙的问题。至少,我会将自己限制在一个新类中,而不使用对象;)或者,显式地调用hashing函数,调用myHash()或其他任何函数,并调用z[x.myHash()],这会增加混乱,但会让我个人睡得更好;)我忍不住想到有一个更支持JavaScript的解决方案,所以考虑一下所有这些难看的解决方法;)

        3
  •  0
  •   Ivan Koshelev    7 年前

    如果你在寻找一个JS字典时遇到了这个问题,其中的对象是键,那么看看Map Map vs Object in JavaScript

    推荐文章