المصفوفات في JavaScript (Arrays)
حتى الآن كان كل متغير يحمل قيمة واحدة. لكن ماذا لو أردت أن تحفظ أسماء 30 طالباً في فصلك؟ لن تنشئ 30 متغيراً! في هذا الدرس ستتعلم المصفوفات (Arrays): كيف تحفظ قائمة كاملة في متغير واحد، وتضيف إليها وتحذف منها، وتمر عليها، وتحوّلها بدوال قوية مثل map و filter.
ما هي المصفوفة؟
Section titled “ما هي المصفوفة؟”المصفوفة قائمة مرتبة من القيم. تخيّلها مثل قطار له عربات مرقّمة، وكل عربة تحمل قيمة. نكتبها بين قوسين مربعين، ونفصل بين القيم بفواصل:
let fruits = ["تفاح", "موز", "برتقال"];console.log(fruits[0]);console.log(fruits.length);تفاح3مثل حروف النص تماماً، العناصر مرقّمة من صفر: fruits[0] أول عنصر، و fruits[2] الثالث. و .length تعطيك عدد العناصر.
تعديل عنصر
Section titled “تعديل عنصر”يمكنك تغيير أي عنصر برقمه:
fruits[1] = "مانجو";console.log(fruits);console.log(fruits[5]);[ 'تفاح', 'مانجو', 'برتقال' ]undefinedوإذا طلبت رقماً غير موجود، تحصل على undefined.
الإضافة والحذف والبحث
Section titled “الإضافة والحذف والبحث”let cart = ["قلم", "دفتر"];
cart.push("مسطرة"); // أضف في النهايةconsole.log(cart);
let last = cart.pop(); // احذف آخر عنصر وأرجعهconsole.log(last);console.log(cart);
console.log(cart.includes("قلم")); // هل موجود؟console.log(cart.indexOf("دفتر")); // ما رقمه؟[ 'قلم', 'دفتر', 'مسطرة' ]مسطرة[ 'قلم', 'دفتر' ]true1push و pop تعملان على نهاية المصفوفة، مثل كومة صحون: تضع الصحن الجديد فوق، وتأخذ من فوق.
المرور على العناصر
Section titled “المرور على العناصر”يمكنك استخدام حلقة for العادية، لكن JavaScript توفر طريقتين أسهل:
const colors = ["أحمر", "أخضر", "أزرق"];
for (const color of colors) { console.log(color);}
colors.forEach((color, index) => { console.log(index, color);});أحمرأخضرأزرق0 أحمر1 أخضر2 أزرقfor...ofتعطيك كل عنصر مباشرة: «لكل لون في الألوان…».forEachتأخذ دالة (غالباً سهمية) وتستدعيها مع كل عنصر ورقمه.
map: حوّل كل عنصر
Section titled “map: حوّل كل عنصر”map تأخذ دالة، وتطبقها على كل عنصر، وتُرجع مصفوفة جديدة بالنتائج. تخيّلها مثل آلة تغليف الهدايا: تدخل الأشياء واحداً تلو الآخر، وتخرج كلها مغلّفة.
const prices = [10, 25, 40];const doubled = prices.map((p) => p * 2);console.log(doubled);console.log(prices);[ 20, 50, 80 ][ 10, 25, 40 ]لاحظ أن المصفوفة الأصلية لم تتغير.
filter: اختر بعض العناصر
Section titled “filter: اختر بعض العناصر”filter تأخذ دالة تُرجع true أو false، وتحتفظ فقط بالعناصر التي أعطت true. مثل مصفاة الشاي: تحتفظ بما تريده وتترك الباقي يمر.
const scores = [45, 80, 92, 30, 67];const passed = scores.filter((s) => s >= 50);console.log(passed);[ 80, 92, 67 ]join: من مصفوفة إلى نص
Section titled “join: من مصفوفة إلى نص”console.log(["أحمد", "سارة", "علي"].join(" و "));أحمد و سارة و عليجرّب بنفسك
Section titled “جرّب بنفسك”قائمة مهام صغيرة. أضف مهام جديدة بـ push، وغيّر شرط filter، وجرّب map لتحويل كل المهام:
الناتج
أخطاء شائعة
Section titled “أخطاء شائعة”- البدء بالرقم 1: أول عنصر هو
arr[0]، وآخر عنصر هوarr[arr.length - 1]. - توقع أن map تغيّر الأصل:
mapوfilterتُرجعان مصفوفة جديدة، فاحفظ النتيجة في متغير. - نسيان return داخل map: إذا استخدمت أقواساً معقوفة في الدالة السهمية دون
return، ستحصل على مصفوفة مليئة بـundefined.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
ما ناتج [5, 10, 15].filter((n) => n > 7)؟
filter تحتفظ بالعناصر التي يكون الشرط لها صحيحاً، وهي 10 و 15.
سؤال
إذا كانت const nums = [3, 7, 9]، فما قيمة nums[nums.length - 1]؟
الطول 3، فالرقم الأخير هو 2، و nums[2] قيمته 9.
الخلاصة
Section titled “الخلاصة”- المصفوفة قائمة مرتبة بين
[ ]، وعناصرها مرقّمة من صفر، و.lengthعددها. pushتضيف في النهاية، وpopتحذف من النهاية، وincludesتبحث.for...ofوforEachللمرور على العناصر.mapتحوّل كل عنصر، وfilterتختار بعض العناصر، وكلتاهما تُرجعان مصفوفة جديدة.joinتحوّل المصفوفة إلى نص.