מקנן לולאות ב- JavaScript

אם אתה מתקשה להבין את האתגר Nesting For Loops של freeCodeCamp, אל תדאג. קיבלנו את הגב שלך.

בבעיה זו עליך להשלים את multiplyAll()הפונקציה ולוקח מערך רב מימדי כארגומנט. זכרו שמערך רב מימדי, המכונה לפעמים מערך דו מימדי, הוא רק מערך מערכים, למשל [[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ולולאות מקוננות . עכשיו צא לשם ואתר עם המיטב שבהם!