Влагане за цикли в JavaScript

Ако имате проблеми с разбирането на предизвикателството на FreeCodeCamp за Nesting For Loops, не се притеснявайте. Взехме ти гърба.

В този проблем трябва да завършите multiplyAll()функцията и приема многомерен масив като аргумент. Не забравяйте, че многомерният масив, понякога наричан 2D масив, е просто масив от масиви, например [[1,2], [3,4], [5,6]],.

В редактора отдясно multiplyAll()се дефинира, както следва:

function multiplyAll(arr) { var product = 1; // Only change code below this line // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 

Трябва да завършите функцията, така че тя да умножава productпроменливата по всяко число в под-масивите на параметъра arr, който е многомерен масив.

Има много различни начини за решаване на този проблем, но ние ще се съсредоточим върху най-простия метод, използващ forцикли.

Настройте вашите forцикли

Тъй като arrе многоизмерен масив, ще ви трябват два forцикъла: един, за да премине през всеки от масивите на под-масивите, и друг, за да премине през елементите във всеки под-масив.

Прокарайте вътрешните масиви

За да направите това, създайте forцикъл, както сте правили в предишни предизвикателства:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 

Имайте предвид, че използваме letвместо varза цикъла и за деклариране product. В това предизвикателство няма да забележите разлика между двете, но като цяло е добра практика да използвате ES6 constи letвинаги, когато можете. Можете да прочетете повече за това в тази статия.

Сега регистрирайте всеки от подмасивите в конзолата:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { console.log(arr[i]); } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 

Тъй като се обаждате multiplyAll()с [[1,2],[3,4],[5,6,7]]отдолу, трябва да видите следното:

[ 1, 2 ] [ 3, 4 ] [ 5, 6, 7 ]

Прегледайте елементите във всеки под-масив

Сега трябва да прегледате всяко число в подмасивите, които току-що сте влезли в конзолата.

Премахнете console.log(arr[i]);и създайте друг forцикъл в този, който току-що написахте:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 

Не забравяйте, че за вътрешния контур, трябва да се провери .lengthНА arr[i]тъй като arr[i]е един от под-масиви разгледахме по-рано.

Сега влезте arr[i][j]в конзолата, за да видите всеки от отделните елементи:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { console.log(arr[i][j]); } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 
1 2 3 4 5 6 7

И накрая, умножете productпо всеки елемент във всеки от подмасивите:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { product *= arr[i][j]; } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]);

Ако влезете productв конзолата, ще видите верния отговор за всеки тестов случай:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr[i].length; j++) { product *= arr[i][j]; } } // Only change code above this line console.log(product); return product; } multiplyAll([[1,2],[3,4],[5,6,7]]);
6 // [[1], [2], [3]] 5040 // [[1, 2], [3, 4], [5, 6, 7]] 54 // [[5, 1], [0.2, 4, 0.5], [3, 9]]

Поглед отблизо

Ако все още не сте сигурни защо горният код работи, не се притеснявайте - не сте сами. Работата с вложени цикли е сложна и дори опитни разработчици могат да се объркат.

В такива случаи може да е полезно да регистрирате нещо по-подробно в конзолата. Върнете се към кода си и влезте `Sub-array ${i}: ${arr[i]}`в конзолата точно преди вътрешния forцикъл:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { console.log(`Sub-array ${i}: ${arr[i]}`); for (let j = 0; j < arr[i].length; j++) { product *= arr[i][j]; } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]);

Във външния forцикъл всяка итерация преминава през под-масивите в arr. Трябва да видите това в конзолата:

Sub-array 0: 1,2 Sub-array 1: 3,4 Sub-array 2: 5,6,7

Обърнете внимание, че използваме шаблонни литерали по-горе. `Sub-array ${i}: ${arr[i]}`е същото като 'Sub-array ' + i + ': ' + arr[i]просто много по-лесно за писане.

Сега във вътрешния forцикъл влезте `Element ${j}: ${arr[i][j]}`в конзолата:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { console.log(`Sub-array ${i}: ${arr[i]}`); for (let j = 0; j < arr[i].length; j++) { console.log(`Element ${j}: ${arr[i][j]}`); product *= arr[i][j]; } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]);

Вътрешният forцикъл преминава през всеки елемент във всеки под-масив ( arr[i]), така че трябва да видите това в конзолата:

Sub-array 0: 1,2 Element 0: 1 Element 1: 2 Sub-array 1: 3,4 Element 0: 3 Element 1: 4 Sub-array 2: 5,6,7 Element 0: 5 Element 1: 6 Element 2: 7

Първата итерация iхваща първия подмасив [1, 2],. Тогава първата итерация на jпреминава през всеки елемент в този подмасив:

// i is 0 arr[0] // [1, 2]; // j is 0 arr[0][0] // 1 // j is 1 arr[0][1] // 2 ----- // i is 1 arr[1] // [3, 4] // j is 0 arr[1][0] // 3 // j is 1 arr[1][1] // 4 ...

Този пример е доста прост, но arr[i][j]все пак може да бъде труден за разбиране, без да се регистрират множество неща в конзолата.

Едно бързо подобрение, което можем да направим, е да декларираме subArrayпроменлива във външния forцикъл и да я зададем равна на arr[i]:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { const subArray = arr[i]; for (let j = 0; j < arr[i].length; j++) { product *= arr[i][j]; } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 

След това просто направете няколко ощипвания на кода, за да използвате новата subArrayпроменлива вместо arr[i]:

function multiplyAll(arr) { let product = 1; // Only change code below this line for (let i = 0; i < arr.length; i++) { const subArray = arr[i]; for (let j = 0; j < subArray.length; j++) { product *= subArray[j]; } } // Only change code above this line return product; } multiplyAll([[1,2],[3,4],[5,6,7]]); 

Това трябва да е всичко, което трябва да знаете за многомерните масиви и вложени forцикли. Сега излезте там и повторете с най-доброто от тях!