Улучшено для цикла в 2D Array - JavaScript - PullRequest
5 голосов
/ 12 декабря 2010

Я создал следующий 2D-массив в Javascript

// Create basic linear array
var ImgArray = new Array(4);

// Do the 2D array for each or the linear array slots
for (i=0; i < 4 ; i++) {
    ImgArray[i] = new Array(4)
}

Теперь я хочу перебрать его, используя 2 «улучшено для циклов». Но я застрял на том, как использовать цикл, так как только ImgArray заявил такой. Например;

// Load the images
for(var i in ImgArray) { 
    for( ??? ) {           // How would i do this? What do i state as an array?
          ///...
    }
    document.write("<br>");
}

Любой совет, высоко ценится

Ответы [ 3 ]

16 голосов
/ 12 декабря 2010

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

var i, j, entry, ImgArray;

// Create the array
ImgArray = new Array(4);
for (i=0; i < 4 ; i++) {
    ImgArray[i] = new Array(4);
}

// Loop through both dimensions
for (i = 0; i < ImgArray.length; ++i) {
    entry = ImgArray[i];
    for (j = 0; j < entry.length; ++j) {
        // Do something with entry[j]
    }
}

Это связано с тем, что в нет двухмерных массивов в JavaScript .(На самом деле, даже массивы на самом деле не являются массивами , но давайте не будем там.) Есть «массивы», и запись массива может быть другим массивом, но одна запись массива может быть длиннее или короче, чемдругие.Таким образом, вы извлекаете этот массив и перебираете его длину, которая может отличаться от других в том же «измерении».

Обратите внимание, что я не использовал for..in выше. Не используйте for..in для циклического перемещения по массивам, если вы действительно не знаете, что делаете; подробности здесь .(Если вы делаете действительно знаете, что делаете, и принимаете адекватные меры предосторожности, это нормально, но ваш код, указанный в кавычках, не принимает необходимые меры предосторожности.) for..in делает не повторениеиндексы массива, он перечисляет имена свойств объекта.

Не по теме # 1 : В JavaScript соглашение (которое вы можете игнорировать) заключается только виспользуйте начальные заглавные буквы (ImgArray) для функций конструктора.

Не по теме # 2 : вы можете посмотреть на использование литералов массива ([entry, entry, entry]) вместо new Array(...), но этозависит от того, что вы делаете.

Не по теме # 3 : Очень плохая идея полагаться на вставку точек с запятой (как в вашей строке ImgArray[i] = new Array(4)).Обязательно ставьте точки с запятой там, где они нужны, или вы обнаружите, что не можете должным образом минимизировать свои сценарии и / или что вы будете бороться с нечетными ошибками, которые тратят ваше время.: -)

3 голосов
/ 12 декабря 2010

Это не «расширенная for петля».В любом случае вам не следует перебирать экземпляры Array таким образом, по крайней мере, если вы семантически относитесь к ним как к целочисленным индексам.

Используйте свой оригинальный подход

for (var i = 0; i < 4; ++i)

не забудьте var).Также не беспокойтесь о

var ImgArray = new Array(4);

Просто напишите

var ImgArray = [];
1 голос
/ 26 марта 2013

вам просто нужно сделать цикл for для обоих как таковых

for (var i in array){
   for(var j in array[i]){//do stuff here}
}
...