Как мне ссылаться на элемент массива по его индексу в JavaScript? - PullRequest
1 голос
/ 07 июля 2011

У меня есть массив JavaScript:

Fruit > Banana > Colour > Yellow
               > Size   > Large
               > Cost   > $3.50
      > Apple  > Colour > Green
               > Size   > Small
               > Cost   > $0.42

Я могу получить значения, используя:

alert(Fruit['Banana']['Colour']);

Как получить то же значение, используя индексы? например,

alert(Fruit[0][0]);

Спасибо всем, что вы ведете меня в правильном направлении, вот решение, которое я выбрал:

for (var a in Fruit) {
    //var a gives me "Banana" and "Apple"
    for (var b in Fruit[a]){
        //var b gives me "Colour", "Size" and "Cost"
        //Fruit[a][b] gives me the values
    }
}

Ответы [ 4 ]

3 голосов
/ 07 июля 2011

Я немного растерялся, потому что вы, кажется, ответили на свой вопрос.Я также не знаю, как вы настроили свой массив (ы).Но если вы посмотрите на этот пример, вы увидите, что он работает здесь:

http://jsfiddle.net/uyNnH/

Это предполагает, что массив верхнего уровня содержит ваши типы фруктов, а массив второго уровня содержит каждый фруктсвойства типа.

Обновление :

Из Mozilla и Другие :

В JavaScript 1.0,Вы можете ссылаться на свойства объекта по их имени или по порядковому номеру.Однако в JavaScript 1.1 или более поздней версии, если вы изначально определяете свойство по его имени, вы всегда должны ссылаться на него по его имени, а если вы изначально определяете свойство по индексу, вы всегда должны ссылаться на него по его индексу.

Таким образом, проблема в том, что вы объявляете ассоциативный массив вместо индексированного / порядкового.Единственное решение, которое я могу придумать, - это использовать (безобразный) цикл for.Вот некоторый непроверенный псевдокод:

function getItemByIndex(index, array) {
    var counter = 0;

    for (item in array)
    {
        if (counter == index)
        {
            return item;
        }

        counter++;
    }
}
2 голосов
/ 07 июля 2011

Похоже, вы путаете JavaScript объекты массива с тем фактом, что все объекты являются ассоциативными массивами .Обратите внимание, что обычные объекты (например, объект «Fruit», на которые вы ссылаетесь) не имеют внутреннего упорядочения свойств (ключей), в отличие от объектов Array (из-за естественного упорядочения интегральных индексов).По сути, массив - это просто объект со специальным свойством «length», в котором хранится последний целочисленный индекс (начиная с нуля) плюс один.

Любые свойства объекта будут повторяться в произвольно (например, случайный) порядок:

var obj = {a:'Aye', b:'Bee', c:'See', d:'Dee'};
for (var prop in obj) {
  alert(prop + '=' + obj[prop]); // No order is guaranteed.
}

Строго говоря, четные массивы не гарантируются спецификацией для итерации в естественном порядке с использованием цикла for-in;однако, большинство интерпретаторов JavaScript делают так или иначе.(Примечательно, что IE8 выполняет итерацию в том порядке, в котором были назначены индексы, а не в естественном порядке.) Вот почему вы должны всегда выполнять итерацию массивов, используя индексы в простом цикле «for».

var arr = ['a', 'b', 'c', 'd', 'e', 'f'];
for (var i=0; i<arr.length; i++) { // i = [0 .. length-1]
  alert(arr + '=' + arr[i]); // Explicitly order as 'a', 'b', 'c'...
}

Эти различия означают, что независимоот того, как определен ваш объект "Fruit", нет надежного способа обеспечить строгое упорядочение ключей (например, "Banana", "Apple", "Color", "Size" и т. д.), если вы не сохраните свой собственный порядок отдельно.

1 голос
/ 07 июля 2011

Вы не можете , , если только вы не скопируете свои строковые индексы в числовые индексы, но они будут новыми элементами в вашем массиве

0 голосов
/ 07 июля 2011

Вы не указываете, как создать свой массив или назначить эти значения, но похоже, что вы не знаете разницы между массивом JavaScript и объектом JavaScript.

У объекта есть свойства с ключамиэто строки, но вы не можете получить доступ к этим свойствам с помощью целого числа индекса, только по ключу.

Массив - это особый тип объекта, который обеспечивает функциональность массива, такую ​​как свойство length, и некоторые методы, такие какsort() и т. Д. Свойства массива обычно присваиваются с помощью числовых индексов, а свойство length основано на этих численно индексированных свойствах, но поскольку массивы по-прежнему являются объектами, вы также можете назначать свойства с помощью строковых ключей.Если вы говорите myArray['banana'] = .., что свойство 'banana' недоступно через индексный номер.

Если вам нужны ключи типа "banana", вам вообще не следует использовать массив, просто используйте простой объект.

Есть множество статей, объясняющих это гораздо глубже;вот что я нашел случайно: http://andrewdupont.net/2006/05/18/javascript-associative-arrays-considered-harmful/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...