הגדרת מערכים בג'אווה סקריפט
מערך הוא רשימה של איברים שמשוייכים כולם לאותו המשתנה או לאותו הקבוע.
נראה מספר דוגמאות להגדרת מערכים:
<script>
var fruits = ["banana", "apple", "orange"];
var names = [
"Yael",
"Tamar",
"Rotem"
];
const areas = ["Haifa", "Tel Aviv", 70];
</script>
הגדרנו מערך בשם fruits שכולל 3 איברים: המחרוזת "banana" במקום ה-0, המחרוזת "apple" במקום ה-1 והמחרוזת "orange" במקום ה-2.
באופן דומה, הגדרנו את המערך names. הפעם בחרנו להציג אותו בצורה קצת אחרת, כאשר כל איבר יהיה בשורה נפרדת. זה לא באמת משנה, אפשר לבחור לעשות מה שנוח יותר מבחינתכם.
המערך areas הוגדר להיות const ולכן מרגע שהוא הוגדר, לא ניתן יהיה לקבוע את areas כמערך אחר (נשים לב: כן ניתן יהיה לשנות את המערך areas עצמו). הוא כולל 3 איברים, כאשר 2 מהם (מקומות 0 ו-1) מחרוזות והשלישי האחרון (במקום 2) הוא מספר.
נוכל גם להגדיר מערך ריק ולהוסיף לו איברים באופן הבא:
<script>
var cars = [];
cars[0] = "Subaru";
cars[1] = "Toyota";
cars[2] = "Mazda";
</script>
מדוע בכלל אנו זקוקים למערכים?
אם לא היו מערכים, היינו זקוקים להגדיר כל איבר במשתנה/בקבוע אחר. נניח ככה:
<script>
var fruit1 = "banana";
var fruit2 = "apple";
var fruit3 = "orange";
</script>
מעבר לעובדה שזו הגדרה ארוכה יותר ופחות נוחה, נתקשה מאוד לבצע פעולות עיבוד כלשהן על הפירות השונים ככלל. נראה זאת בהמשך בפרק של הלולאות.
פעולות על מערכים
נדגים מספר פעולות על מערכים ונסביר כל פעולה.
<script>
const cities = ["New York", "Amsterdam", "Jerusalem", "Tokyo"];
var numCities = cities.length; // 4
var israelCapital = cities[2]; // Jerusalem
cities[0] = "Seattle";
console.log(cities); // ["Seattle", "Amsterdam", "Jerusalem", "Tokyo"]
console.log(Array.isArray(cities)); // true
</script>
הגדרנו מערך של ערים בשם cities.
התכונה length מחזיקה את כמות האיברים במערך, בדוגמה שלנו 4.
כדי לגשת לאיבר מסויים במערך, נרשום את המקום של האיבר בסוגריים, למשל cities[2] שמחזיר את האיבר במקום ה-2 (נזכור כי הספירה מתחילה מ-0).
נוכל לבצע החלפה של איבר במערך על ידי גישה ישירה למקום של האיבר במערך, למשל השמה לתוך cities[0].
נשאלת השאלה: כיצד ניתן לשנות איבר במערך אם הוא מוגדר כ-const?
התשובה: מערך שמוגדר כ-const ניתן לשנות לו איברים (ואף להוסיף ולמחוק איברים), אבל לא ניתן להגדירו מחדש. קצת מבלבל.
הפונקציה Array.isArray בודקת אם האובייקט שבסוגריים הוא מערך ומחזירה ערך בוליאני (true או false) בהתאם.
שימוש במערך כמחסנית LIFO Stack
מחסנית היא מבנה נתונים שמבוסס על רשימת איברים שעובדת בשיטת LIFO, כלומר Last In First Out. האיבר האחרון שמוכנס למחסנית עם push הוא האיבר הראשון שיצא עם pop.
כל מערך בג'אווה סקריפט יכול להתנהג גם כמחסנית.
דוגמה לשימוש במערך כמחסנית:
<script>
const cities = ["New York", "Amsterdam", "Jerusalem", "Tokyo"];
cities.push("Sydney"); // ["New York", "Amsterdam", "Jerusalem", "Tokyo", "Sydney"]
cities.push("Berlin"); // ["New York", "Amsterdam", "Jerusalem", "Tokyo", "Sydney", "Berlin"]
cities.push("Cairo"); // ["New York", "Amsterdam", "Jerusalem", "Tokyo", "Sydney", "Berlin", "Cairo"]
var city = cities.pop(); // "Cairo"
console.log(cities); // ["New York", "Amsterdam", "Jerusalem", "Tokyo", "Sydney", "Berlin"]
city = cities.pop(); // "Berlin"
console.log(cities); // ["New York", "Amsterdam", "Jerusalem", "Tokyo", "Sydney"]
</script>
ניתן לראות כי כל פקודת push מוסיפה איבר לסוף המערך (שמשמש כמחסנית) וכל פקודת pop מוציאה את האיבר האחרון שהוכנס.
שימוש במערך כתור FIFO Queue
באמצעות מערכים בג'אוה סקריפט, ניתן גם לממש תור או תור הפוך.
תור הוא הוא מבנה נתונים שמבוסס על רשימת איברים שעובדת בשיטת FIFO, כלומר First In First Out. האיבר הראשון שמוכנס לתור עם push הוא האיבר הראשון שיצא עם shift.
תור הפוך הוא מבנה נתונים כמו תור, רק שסדר ההכנסה הפוך. האיבר הראשון שמוכנס עם unshift הוא האיבר הראשון שיצא עם pop.
נוח יותר לזכור כי unshift מכניס ערך בתחילת המערך (ולמעשה "דוחף" את כל האיברים שהוכנסו לכיוון סוף המערך) וכי shift מוציא את הערך שבתחילת המערך (ולמעשה "מושך" את כל האיברים שהוכנסו לכיוון תחילת המערך).
דוגמה להכנסה ולהוצאה של איברים מתחילת מערך:
<script>
const cities = ["New York", "Amsterdam", "Jerusalem", "Tokyo"];
cities.unshift("Sydney"); // ["Sydney", "New York", "Amsterdam", "Jerusalem", "Tokyo"]
cities.unshift("Berlin"); // ["Berlin", "Sydney", "New York", "Amsterdam", "Jerusalem", "Tokyo"]
cities.unshift("Cairo"); // ["Cairo", "Berlin", "Sydney", "New York", "Amsterdam", "Jerusalem", "Tokyo"]
var city = cities.shift(); // "Cairo"
console.log(cities); // ["Berlin", "Sydney", "New York", "Amsterdam", "Jerusalem", "Tokyo"]
city = cities.shift(); // "Berlin"
console.log(cities); // "Sydney", "New York", "Amsterdam", "Jerusalem", "Tokyo"]
</script>