Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解决方法:将对象作为键的javascript字典_Javascript_Dictionary_Hashtable - Fatal编程技术网

解决方法:将对象作为键的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__;

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

  • 字典必须能够将对象作为键
  • 这些值必须可由[]-运算符访问
所以我想到了覆盖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方法在整个代码中没有用于其他目的,您认为有任何缺点吗?

这是一个有趣的问题,因为到目前为止,我假设任何对象都可以用作索引(但从未尝试使用关联数组)。我不太清楚JavaScript的内部工作原理,但我敢打赌valueOf在其他地方被JavaScript使用,即使不是在您的代码中。你以后可能会遇到看似无法解释的问题。至少,我会限制自己使用一个新类,而不使用对象;)或者,显式地调用散列函数,调用它myHash()或其他任何函数,然后调用z[x.myHash()],这会增加混乱,但会让我个人睡得更好;)我无法抗拒认为有更多的JavaScript意识到的解决方案,所以考虑所有这些丑陋的解决方案;p> 这是一个有趣的想法。我建议我的建议。它满足您的第一个要求,但不满足第二个要求。我并不认为坚持使用方括号属性访问符号有什么好处:您对它有特殊要求吗

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

你的想法有一些缺点:

  • 您的
    valueOf
    方法将在任何本机对象上的
    for…in
    循环中显示
  • 您无法确定哪些键应被视为相等,这是您可能希望执行的操作。相反,所有密钥都将被视为唯一的
  • 这不适用于主机对象(即环境提供的对象,如DOM元素)

  • 如果你在寻找一本以对象为键的JS字典时遇到了这个问题,请查看地图

    我以前一直使用过你的库,它运行良好。但目前我正在开发一个ActionScript3到Javascript的转换器。AS3提供了一个字典。如果我使用你的库,我需要检查类型并用get/set替换括号。如果我使用对象,则value of不会出现在for…中,但如果我定义了一个新的“类”,则会出现。(在其他浏览器中,这种行为可能有所不同)。因为我不喜欢覆盖Object.prototype.valueOf本身,所以您回答了我的问题