آرایه های چند بعدی
آرایههای چند بعدی آرایههایی هستند که برای دسترسی به هر یک از عناصر آنها باید از چندین اندیس استفاده کنیم. یک آرایه چند بعدی را میتوان مانند یک جدول با تعدای ستون و ردیف تصور کنید. با افزایش اندیسها اندازه ابعاد آرایه نیز افزایش مییابد و آرایههای چند بعدی با بیش از دو اندیس به وجود میآیند. نحوه ایجاد یک آرایه با دو بعد به صورت زیر است :
var array_name = [ [value1,value2,value3], [val1,val2,val3] ];
می توان گفت که یک آرایه دو بعدی، خود آرایه ای از آرایه هاست. یعنی هر عنصر این نوع آرایه، خود یک آرایه است. آرایه دو بعدی رو می توان به صورت یک جدول تصور کرد که دارای سطر و ستون می باشد. در یک آرایه دو بعدی برای دسترسی به هر یک از عناصر به دو مقدار نیاز داریم، یکی اندیس سطر و دیگری اندیس ستونی که آن عنصر در آن قرار دارد. یک مثال از آرایه دو بعدی در زیر آمده است :
var numbers = [ [ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [11, 12, 13, 14, 15] ];
در کد بالا یک آرایه به نام numbers تعریف شده است که دارای سه عنصر است. البته هر کدام از این عناصر خود یک آرایه می باشند. یعنی آرایه numbers آرایه است از 3 آرایه. هر کدام از این آرایه ها هم 5 عنصر دارند. پس می توان گفت که آرایه numbers در واقع یک جدول با 3 سطر و 5 ستون می باشد. میتوان مقدار دهی به عناصر را به صورت دستی انجام داد مانند :
var numbers = [];
numbers[0][0] = 1;
numbers[0][1] = 2;
numbers[0][2] = 3;
numbers[0][3] = 4;
numbers[0][4] = 5;
numbers[1][0] = 6;
numbers[1][1] = 7;
numbers[1][2] = 8;
numbers[1][3] = 9;
numbers[1][4] = 10;
numbers[2][0] = 11;
numbers[2][1] = 12;
numbers[2][2] = 13;
numbers[2][3] = 14;
numbers[2][4] = 15;
همانطور که مشاهده میکنید برای دسترسی به هر یک از عناصر در یک آرایه دو بعدی به سادگی میتوان از اندیسهای سطر و ستون و یک جفت کروشه مانند مثال استفاده کرد.
گردش در میان عناصر آرایههای چند بعدی
گردش در میان عناصر آرایههای چند بعدی نیاز به کمی دقت دارد. یکی از راههای آسان استفاده از حلقه for…of و یا حلقه for تو در تو است. اجازه دهید ابتدا از حلقه for…of استفاده کنیم.
var numbers = [ [ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10], [11, 12, 13, 14, 15] ]; for (var array of numbers) { for (var num of array) { console.log(num); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
مشاهده کردید که گردش در میان مقادیر عناصر یک آرایه چند بعدی چقدر راحت است. حلقه for…of اول برای گردش در میان عناصر آرایه اصلی یعنی numbers و حلقه for…of دوم برای گردش در میان عناصر آرایه های عضو، به کار رفته است. حال همین کار را با حلقه for اناجم می دهیم:
1: var numbers = [ 2: [ 1, 2, 3, 4, 5], 3: [ 6, 7, 8, 9, 10], 4: [11, 12, 13, 14, 15] 5: ]; 6: 7: for (var row = 0; row < numbers.length; row++) 8: { 9: for (var col = 0; col < numbers[row].length; col++) 10: { 11: console.log(numbers[row][col]); 12: } 13: }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
از آنجاییکه آرایه دو بعدی به صورت یک جدول شامل سطر و ستون است، پس لازم است که از یک حلقه for برای گردش در میان سطرها و از حلقه for دیگر برای گردش در میان ستونهای این جدول (آرایه) استفاده کنیم. اولین حلقه for (خط 7) برای گردش در میان ردیفهای آرایه به کار میرود. این حلقه به تعداد سطرها یعنی سه بار تکرار می شود. در این مثال از حاصیت length آرایه استفاده کردهایم. این خاصیت تعداد عناصر آرایه را نشان میدهد.
در داخل اولین حلقه for حلقه for دیگری تعریف شده است (خط 9). در این حلقه یک شمارنده برای شمارش تعداد ستونها (col) که در واقع همان عناصر آرایه ها هستند، تعریف شده است و در شرط داخل آن بار دیگر از خاصیت length استفاده شده است. در مجموع این حلقه بیرونی برای شمارش تعداد عناصر آرایه اصلی و حلقه داخلی برای شمارش تعداد عناصر آرایه های داخلی می باشد. . پس به عنوان مثال وقتی که مقدار ردیف (row) صفر باشد، حلقه دوم از [0][0] تا [4][0] اجرا میشود. سپس مقدار هر عنصر از آرایه را با استفاده از حلقه نشان میدهیم، اگر مقدار ردیف(row) برابر 0 و مقدار ستون (col) برابر 0 باشد مقدار عنصری که در ستون 1 و ردیف 1 (numbers[0][0]) قرار دارد نشان داده خواهد شد که در مثال بالا عدد 1 است.
بعد از اینکه دومین حلقه تکرار به پایان رسید، فوراً دستورات بعد از آن اجرا خواهند شد، که در اینجا دستور console.log(“\n”) که به برنامه اطلاع میدهد که به خط بعد برود. سپس حلقه با اضافه کردن یک واحد به مقدار row این فرایند را دوباره تکرار میکند. سپس دومین حلقه for اجرا شده و مقادیر دومین ردیف نمایش داده میشود. این فرایند تا زمانی اجرا میشود که مقدار row کمتر از طول اولین بعد باشد. حال بیایید آنچه را از قبل یاد گرفتهایم در یک برنامه به کار بریم. این برنامه نمره چهار درس مربوط به سه دانش آموز را از ما میگیرد و معدل سه دانش آموز را حساب میکند.
1: var studentGrades = [ 2: new Array(4), 3: new Array(4), 4: new Array(4) 5: ]; 6: var total; 7: 8: for (var student = 0; student < studentGrades.length; student++) 9: { 10: total = 0; 11: 12: console.log("Enter grades for Student", student + 1); 13: 14: for (var grade = 0; grade < studentGrades[student].length; grade++) 15: { 16: studentGrades[student][grade] = prompt("Enter Grade " + (grade + 1)); 17: console.log("Enter Grade #" + (grade + 1) + ": " + studentGrades[student][grade]); 18: total += parseFloat(studentGrades[student][grade]); 19: } 20: 21: console.log("Average is ",(total / (studentGrades[student].length)).toPrecision(2)); 22: console.log("\n"); 23: }
Enter grades for Student 1 Enter Grade #1: 92 Enter Grade #2: 87 Enter Grade #3: 89 Enter Grade #4: 95 Average is 90.75 Enter grades for Student 2 Enter Grade #1: 85 Enter Grade #2: 85 Enter Grade #3: 86 Enter Grade #4: 87 Average is 85.75 Enter grades for Student 3 Enter Grade #1: 90 Enter Grade #2: 90 Enter Grade #3: 90 Enter Grade #4: 90 Average is 90.00
در برنامه بالا یک آرایه چند بعدی از نوع double تعریف شده است (خط 5-1). همچنین یک متغیر به نام total تعریف میکنیم که جمع نمرات وارد شده برای دانش آموز در آن قرار میگیرد (خط 6). حال وارد حلقه for تو در تو میشویم (خط 23-8). در اولین حلقه for یک متغیر به نام student تعریف کردهایم که تعداد دانش آموزان در آن قرار میگیرد. از خاصیت length هم برای تشخیص تعداد دانش آموزان استفاده شده است. وارد بدنه حلقه for میشویم. در خط 10 مقدار متغیر total را برابر 0 قرار میدهیم. سپس برنامه یک پیغام را نشان میدهد و از شما میخواهد که نمرات دانش آموز را وارد کنید (student + 1). عدد 1 را به student اضافه کردهایم تا به جای نمایش Student 0، با Student 1 شروع شود، تا طبیعیتر به نظر برسد (خط 12). سپس به دومین حلقه for در خط 14 میرسیم. وظیفه این حلقه گردش در میان دومین بعد که همان نمرات دانش آموز است میباشد. برنامه چهار نمره مربوط به دانش آموز را میگیرد. هر وقت که برنامه یک نمره را از کاربر دریافت میکند، نمره به متغیر total اضافه میشود.
وقتی همه نمرهها وارد شدند، متغیر total هم جمع همه نمرات را نشان میدهد. در خط 21 معدل دانش آموز نشان داده میشود. به متد toPrecision(2) توجه کنید. این متد معدل را تا دو رقم اعشار نشان میدهد. معدل از تقسیم کردن total (جمع) بر تعداد نمرات به دست میآید. از studentGrades[student].length هم برای به دست آوردن تعداد نمرات استفاده میشود.