Подтвердить что ты не робот

Многомерные массивы JavaScript

Это был не вопрос, который я собирался спросить, но я неожиданно сел на мель с массивами JavaScript. Я исхожу из PHP-фона, и, посмотрев несколько сайтов, я не мудрее.

Я пытаюсь создать многомерный массив.

var photos = new Array;
var a = 0;
$("#photos img").each(function(i) {
    photos[a]["url"] = this.src;
    photos[a]["caption"] = this.alt;
    photos[a]["background"] = this.css('background-color');
    a++;
});

Сообщение об ошибке: фотографии [a] - undefined. Как мне это сделать? Спасибо.

4b9b3361

Ответ 1

JavaScript не имеет многомерных массивов, но массивы массивов, которые можно использовать аналогичным образом.

Вы можете попробовать следующее:

var photos = [];
var a = 0;
$("#photos img").each(function(i) {
    photos[a] = [];
    photos[a]["url"] = this.src;
    photos[a]["caption"] = this.alt;
    photos[a]["background"] = this.css('background-color');
    a++;
});

Обратите внимание, что вы могли бы использовать new Array() вместо [], но последнее рекомендуется. Также обратите внимание, что в первой строке отсутствует скобка new Array().


ОБНОВЛЕНИЕ:. Следуя приведенным ниже комментариям, в приведенном выше примере не было необходимости использовать массивы массивов. Массив объектов был бы более уместным. Код по-прежнему действителен, поскольку массивы являются объектами на этом языке, но следующее было бы лучше:

photos[a] = {};
photos[a]["url"] = this.src;
photos[a]["caption"] = this.alt;
photos[a]["background"] = this.css('background-color');

Ответ 2

Вы пытаетесь присвоить что-то photos[a]["url"], photos[a]["caption"] и т.д., но photos[a] еще не существует. photos - сначала пустой массив, поэтому сначала нужно установить photos[a]. Поскольку вы хотите использовать строковые ключи ("url", "caption" и т.д.), Это что-то должно быть простым объектом (эквивалентом javascript для массивов php associave) (или хэшем, если это позволяет его база кода). Затем вы можете использовать литеральную конструкцию объекта для упрощения своей функции и Array#push, чтобы избавиться от ненужного a:

var photos = [];
$("#photos img").each(function(img) {
    photos.push({
      url: img.src,
      caption: img.alt,
      background: img.style.backgroundColor
    });
});

Кроме того, убедитесь, что this на самом деле является вашим элементом img. Некоторые реализации each устанавливают this глобальному объекту в вашем случае.

edit: ok, похоже, что jQuery.each автоматически устанавливает this в итерированный элемент, но не переносит его в jQuery-goodness, поэтому вам нужно либо обернуть this в $(), либо использовать plain DOM (я использовал последний в моем примере).

edit2: в любом случае использование this довольно странно, поскольку функция обратного вызова, переданная в each, получает аргумент. Возможно также использовать этот аргумент (переименованный).

Ответ 3

var photos = [];
var imgs = document.getElementById("photos").getElementsByTagName("img");
for(var i=0;i<imgs.length;i++){
    photos.push({
        src:imgs[i].src,
        alt:imgs[i].alt,
        background:imgs[i].style.backgroundColor
    });
}

Это должно дать вам что-то, что примерно эквивалентно этому в PHP (я сделал притворные данные):

Array(
    [0] => Array(
        "src" => "logo.png",
        "alt" => "My Logo!",
        "background" => "#ffffff"
    )
)

Надеюсь, это поможет!

Ответ 4

Когда я прочитал этот поток, я пытался понять многомерные ассоциативные массивы. Это было непонятно, поэтому я продолжал исследовать, вот что я придумал:

var images = new Array;
images['logo'] = { 'src': 'http://example.com/image1.png', 'caption': 'this is the logo', 'background':  '#000'};
images['background'] = { 'src': 'http://example.com/image2.png', 'caption': 'this is the background', 'background':  '#FFF'};
alert(images['logo']['src']); /* output: http://example.com/image1.png */
alert(images['background']['caption']); /* output: this is the background */

Надеюсь, это поможет!

Ответ 5

многомерные массивы находятся в этой структуре:

var photos = new Array();
photos[0] = new Array();

используйте его как:

photos[0][0] = this.src;

подробнее о массиве JS здесь.

Ответ 6

Дуглас Крокфорд, JSLint, вы бы создали его таким образом ( "Использовать литерал литерала []" ):

var photos = [];

Теперь помните, что вы хотите создать многомерные массивы, что означает массив внутри массива. Это означает, что вам необходимо создать внутренние массивы:

$("#photos img").each(function(i) {
  photos[a] = []
  //continue