ассоциативный массив javascript и jQuery.each () - PullRequest
0 голосов
/ 03 января 2012

Может кто-нибудь взглянуть на это: http://jsfiddle.net/VkFRU/4/

и объясните вывод консоли, который я вижу (это "0", "true", "false" и "덜 읽기")?

Четыре отдельных вызова console.log () выдают именно то, что я ожидаю, за исключением первого. Почему говорится, что длина равна 0?

Тот, что в итераторе $ .each () ничего не выводит. Почему нет?

Ответы [ 4 ]

2 голосов
/ 03 января 2012

Четыре отдельных вызова console.log () выдают именно то, что я ожидаю, за исключением первого. Почему говорится, что длина равна 0?

Только численные свойства учитываются для length. 'ko' не является числовым.

Из спецификации :

Свойство length этого объекта Array является свойством данных, значение которого всегда численно больше, чем имя каждого удаляемого свойства, имя которого является массивом index .

Где Индекс массива определяется как:

Имя свойства P (в виде значения String) является индексом массива тогда и только тогда, когда ToString (ToUint32 ( P )) равно P и ToUint32 ( P ) не равны 2 32 -1.

Следовательно, ko не является индексом массива.

Тот, что в итераторе $ .each () ничего не выводит. Почему нет?

Поскольку jQuery распознает аргументы как массив и перебирает его значения, вероятно, следующим образом:

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

Вы уже заметили, что translations.length - это 0.


Вы делаете ошибку, чтобы использовать массив в качестве ассоциативного массива. Вместо этого используйте объект :

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

Причиной, по которой вы можете назначать нечисловые свойства массивам, является просто тот факт, что массивы также являются объектами. Но это не значит, что вы должны использовать их как таковые. Специальные методы массива не применяются к нечисловым свойствам.

Я бы посоветовал вам прочитать больше о массивах в MDN JavaScript Guide .

1 голос
/ 03 января 2012

Вам нужны объекты. Массивы в 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 не имеют атрибута длины, вам придется добавить один

0 голосов
/ 03 января 2012

Вы объявляете var translations = []; как массив. Следующая инструкция translations['ko'] = []; фактически добавляет свойство ko к экземпляру translations . Таким образом, вы сможете получить к нему доступ, используя translations.ko . Чтобы добавить один элемент в массив, вы должны использовать оператор push, который увеличит длину массива translations , добавив еще один элемент. см. демо здесь: http://jsfiddle.net/diode/VkFRU/5/

0 голосов
/ 03 января 2012

Ассоциативный массив на самом деле является объектом. И у объектов действительно нет длины.

С другой стороны, 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;
...