【问题标题】:javascript associative array and jQuery.each()javascript 关联数组和 jQuery.each()
【发布时间】:2012-01-03 16:59:20
【问题描述】:

有人可以看看这个: http://jsfiddle.net/VkFRU/4/

并解释我看到的控制台输出(即“0”、“true”、“false”和“덜 읽기”)?

四个单独的 console.log() 调用输出完全符合我的预期,除了第一个。为什么说长度为0?

$.each() 迭代器中的那个不输出任何东西。为什么不呢?

【问题讨论】:

  • 请在问题正文中发布您的代码。

标签: jquery arrays each


【解决方案1】:

四个单独的 console.log() 调用输出完全符合我的预期,除了第一个。为什么说长度为0?

length 仅考虑数字属性。 'ko' 不是数字。

来自specification

此 Array 对象的 length 属性是一个数据属性,其值在数值上始终大于名称为数组 index 的每个可删除属性的名称。

Where array index is defined as:

属性名称 P(以字符串值的形式)是数组索引当且仅当 ToString(ToUint32(P)) 等于 P 和 ToUint32(P) 不等于 232-1。

因此ko 不是数组索引。

$.each() 迭代器中的那个不输出任何东西。为什么不呢?

因为 jQuery 将参数识别为数组,所以迭代其值,可能是这样:

for(var i = 0; i < arg.length; i++)

您已经注意到translations.length0


您错误地使用 array 作为关联数组。使用 object 代替:

var translations = {};
translations['ko'] = {}; 

您可以将非数字属性分配给数组的原因很简单,因为数组也是对象。但这并不意味着您应该这样使用它们。特殊的数组方法不适用于非数值属性。

我建议您在 MDN JavaScript Guide 中阅读有关数组的更多信息。

【讨论】:

    【解决方案2】:

    你需要物品。 JavaScript 中的数组不是关联的,因此您不能通过名称访问它们的成员,只能通过数字访问它们

    所以要么:

    var translations = {};
    translations.length = 0;
    translations['ko'] = {};
    translations.length++;
    translations['ko']['Read more']    = '자세히보기';
    translations['ko']['Read less']        = '덜 읽기';
    
    console.log(translations.length);
    console.log( 'ko' in translations );
    console.log( 'wtf' in translations );
    console.log( translations['ko']['Read less'] );
    
    $.each(translations, function(lang, phrases) {
        console.log(lang);
    });
    

    但是由于 JS 中的对象没有长度属性,所以你必须添加一个

    【讨论】:

      【解决方案3】:

      关联数组实际上是一个对象。而且,物体并没有真正的长度。

      另一方面,jQuery 会循环使用类似于

      的内容
      for(a in b)
      

      在对象/关联数组 a = key, b = object 的情况下,您可以使用

      b[a]
      

      解释一下正在发生的事情:

      var b = []; //this is an array "object"
      b[0] = 1; //this would set the 0 index of b to 1
      b['test'] = 'value';//this would set the property 'test' of the array object to 'value'
      

      此外,javascript 允许您以两种方式访问​​属性,即 .和[]:

      b['test'] = b.test;
      

      【讨论】:

        【解决方案4】:

        您将var translations = []; 声明为数组。下一条语句translations['ko'] = []; 实际上将属性ko 添加到实例translations。因此,您将能够使用 translations.ko 访问它。要将一个元素添加到数组中,您必须使用 push 语句,该语句将通过添加一个元素来增加数组 translations 的长度。在此处查看演示:http://jsfiddle.net/diode/VkFRU/5/

        【讨论】:

          猜你喜欢
          • 2017-06-07
          • 2011-09-10
          • 1970-01-01
          • 1970-01-01
          • 2011-08-15
          • 2011-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多