【问题标题】:How to implement such an associative array?如何实现这样的关联数组?
【发布时间】:2010-01-13 05:58:30
【问题描述】:
arr[key] = value;

key 是一个 jQuery 对象,value 是一个数组。

【问题讨论】:

    标签: javascript jquery arrays


    【解决方案1】:

    JavaScript 中并不真正存在关联数组。但是,您可以使用 JavaScript 对象实现类似的功能:

    // Create object
    var myObject = {
        key: value,
        helloText: "Hello World!"
    };
    
    // Access object in some statement via:
    myObject.helloText
    // ...or:
    myObject["helloText"]
    

    要将对象用作键,您必须执行以下操作:

    var a = {
        helloText: "Hello World!"
    };
    
    var b = {};
    b[a] = "Testing";
    
    alert(b[a]); // Returns "Testing" (at least, in Safari 4.0.4)
    

    不过,使用对象作为键听起来有点奇怪。您确定需要这样做吗?

    更新:

    不能实际上在 JavaScript 中使用一个对象作为键。上述代码似乎起作用的原因是,在语句 b[a] = "Testing"; 中,JavaScript 通过 a.toString()a 转换为字符串,从而产生 "[object Object]",并使用此 字符串 作为钥匙。所以我们的声明其实是b["[object Object]"] = "Testing";,而我们的alert声明和alert(b["[object Object]"]);是一模一样的。

    感谢CMS 在 cmets 中指出这一点!

    更新 2:

    Tim Down 指出他的 JavaScript 库 jshashtable 允许您使用对象作为键。

    【讨论】:

    • 第二个示例 似乎 可以工作,因为属性访问器(括号表示法)在内部转换了属性表达式(括号) 到String,在该示例中b 以一个名为"[object Object]" 的属性结尾。这是应用到atoString 操作的结果,因此您不能真正添加​​更多对象(它们只会更改该属性值)。试试alert(b["[object Object]"]);,它也会显示"Testing"
    • 使用任意对象作为键正是哈希图和关联数组的重点。然而,使用 jQuery 对象作为键,即使它是可能的(它不是),听起来是个坏主意,因为 jQuery 对象可以改变。键必须是常量,例如 DOM 对象的 id。那是一个字符串,所以你可以用它作为键。也许使用 jquery 选择器是一种选择,但它可能包含 javascript 属性可能无法接受的字符(如 #、. 和空格)。
    • @CMS:啊,这很有道理!我已经相应地更新了我的答案。谢谢!
    • 不客气@Steve!,这里有更多关于属性访问者的信息:bclary.com/2004/11/07/#a-11.2.1
    【解决方案2】:

    您可以使用jshashtable,它允许任何 JavaScript 对象作为键。

    【讨论】:

    • 非常有趣!感谢您的链接。
    【解决方案3】:

    只是在这里猜测,但您似乎正在尝试将一些(任意)数据与 jQuery 对象(可能是一个元素)相关联。既然如此,何不使用data ()方法呢?

    $('#el').data (value);
    

    【讨论】:

    • 我也会推荐这个,忘了他提到了 jQuery。
    • 嗯,在问题的第一个版本中,key 据说是一个 DOM 元素,据我所知,这个问题没有被 jquery 标记。这就是让我们走上“错误”/更麻烦的轨道的原因。
    【解决方案4】:

    您不能将对象用作键,并且关联数组不是它们在 Javascript 中看起来的那样,因为您所做的只是在数组对象上设置一个属性,当您通过 .length 循环时它本机不会'不考虑您设置的手动定义的属性。

    我建议将元素和数组存储在对象字面量中,全部存储在数组中。例如:

    var list = [
        {
            el:document.body,
            arr:[1,2]
        }
    ];
    
    for ( var i = 0, l = list.length; i<l; ++i ) {
        alert( list[i]['el'] )
        alert( list[i]['arr'][0] )
    }
    
    // add elements to the array
    
    list.push({
        el:document.body.firstChild,
        arr:[3,4]
    })
    

    正如 kprime 在他的回答中提到的那样,如果您使用 Javascript,最好使用 .data()

    if ( !$(el).data('key') ) {
        $(el).data('key', [2,3,4] );
    }
    

    【讨论】:

      【解决方案5】:

      我建议为要放入关联容器(JS 中的对象)中的每个元素分配一个唯一 ID,并使用该 ID 作为键:

      var idCounter = 0;
      var container = { };
      function storeValue(element, value) {
          if (!element.getAttribute('id')) {
              element.setAttribute('id', makeID());
          }
          var id = element.getAttribute('id');
          container[id] = value;
      }
      function makeID() {
          return 'unique-id-' + idCounter++;
      }
      

      编辑:此解决方案假定 jQuery 不可用。如果是,请使用data('key', value)

      【讨论】:

        【解决方案6】:

        每个 javascript 对象都是一个关联数组,这是语言中构建的属性,你不需要任何特殊的东西,就这样使用它

        【讨论】:

        • 查看第一个答案的 cmets。
        猜你喜欢
        • 1970-01-01
        • 2010-09-19
        • 2013-03-15
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多