javascript关联数组和jQuery.each()

时间:2012-01-03 16:59:21

标签: jquery arrays each

有人可能会看一看: http://jsfiddle.net/VkFRU/4/

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

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

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

4 个答案:

答案 0 :(得分:2)

  

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

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

来自specification

  

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

Where array index is defined as:

  

当且仅当ToString(ToUint32( P ))等于​​ P (以String值的形式)是一个数组索引> P 和ToUint32( P )不等于2 32 -1。

因此ko不是数组索引。

  

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

因为jQuery将参数识别为数组,所以可能以这种方式迭代它的值:

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

您已注意到translations.length0


您错误地将数组用作关联数组。改为使用对象

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

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

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

答案 1 :(得分:1)

你需要物品。 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中的对象没有长度属性,因此您必须添加一个

答案 2 :(得分:0)

关联数组实际上是一个对象。并且,对象实际上没有长度。

另一方面,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;

答案 3 :(得分:0)

您将var translations = [];声明为数组。下一个语句translations['ko'] = [];实际上将属性 ko 添加到实例翻译。因此,您可以使用 translations.ko 访问它。要向数组添加一个元素,您必须使用push语句,这将通过添加一个元素来增加数组翻译的长度。请参阅此处的演示:http://jsfiddle.net/diode/VkFRU/5/