| الدالة | الوظيفة | تُعدّل الأصلية؟ |
|---|---|---|
| push() / pop() | إضافة/حذف من النهاية | نعم |
| map() | مصفوفة جديدة بتحويل كل عنصر | لا |
| filter() | مصفوفة جديدة بعناصر تحقق شرطاً | لا |
| reduce() | اختزال المصفوفة لقيمة واحدة | لا |
| sort() | ترتيب العناصر | نعم |
| find() | أول عنصر مطابق لشرط | لا |
المصفوفة (Array) هي هيكل بيانات يُخزّن قائمة مرتبة من العناصر، ويمكن الوصول لكل عنصر عبر فهرسه (Index) الذي يبدأ دائماً من الصفر. تُعرَّف المصفوفة بين قوسين مربعين []، ويمكن أن تحتوي عناصر من أنواع مختلفة في نفس المصفوفة، رغم أن الممارسة الجيدة تُفضّل الاتساق في النوع.
تمتلك المصفوفات مجموعة غنية من الدوال (Methods) المدمجة لتسهيل العمل معها. push() وpop() يُضيفان ويحذفان عنصراً من النهاية، وshift() وunshift() يفعلان نفس الشيء من البداية. slice() تُنشئ مصفوفة جزئية جديدة دون تعديل الأصلية، بينما splice() تُعدّل المصفوفة الأصلية مباشرة بالحذف أو الإضافة أو الاستبدال في مكان محدد.
أهم ثلاث دوال في البرمجة الوظيفية الحديثة هي map() التي تُنشئ مصفوفة جديدة بتطبيق دالة على كل عنصر، وfilter() التي تُنشئ مصفوفة جديدة تحتوي فقط العناصر التي تحقق شرطاً معيناً، وreduce() التي "تُختزل" المصفوفة بالكامل إلى قيمة واحدة (مثل مجموع، أو أكبر قيمة، أو حتى كائن جديد) عبر تراكم النتيجة تكرارياً.
dوال أخرى مهمة: find() تُعيد أول عنصر يحقق شرطاً، includes() تتحقق من وجود قيمة، sort() تُرتب المصفوفة (مع ملاحظة أنها تُعدّل الأصلية وتُرتب افتراضياً كنصوص ما لم تُمرَّر لها دالة مقارنة)، وforEach() تُنفذ دالة على كل عنصر دون إنشاء مصفوفة جديدة، وهي مناسبة عندما تريد فقط تنفيذ إجراء (مثل الطباعة) لا إنتاج نتيجة جديدة.
| 1 | const أرقام = [5, 2, 8, 1, 9]; |
| 2 | |
| 3 | أرقام.push(10); // إضافة للنهاية |
| 4 | أرقام.pop(); // حذف من النهاية |
| 5 | |
| 6 | const مضاعفة = أرقام.map(ر => ر * 2); |
| 7 | const كبيرة = أرقام.filter(ر => ر > 3); |
| 8 | const مجموع = أرقام.reduce((م, ر) => م + ر, 0); |
مثال 1: map و filter و reduce على مصفوفة كائنات
| 1 | // map, filter, reduce معاً في سيناريو واقعي |
| 2 | const منتجات = [ |
| 3 | { اسم: "قلم", سعر: 5 }, |
| 4 | { اسم: "كتاب", سعر: 40 }, |
| 5 | { اسم: "دفتر", سعر: 15 }, |
| 6 | ]; |
| 7 | |
| 8 | const أسماء = منتجات.map(م => م.اسم); |
| 9 | const غالية = منتجات.filter(م => م.سعر > 10); |
| 10 | const إجمالي_السعر = منتجات.reduce((مجموع, م) => مجموع + م.سعر, 0); |
| 11 | |
| 12 | console.log(أسماء); // ["قلم", "كتاب", "دفتر"] |
| 13 | console.log(غالية.length); // 2 |
| 14 | console.log(إجمالي_السعر); // 60 |
مثال 2: فخ sort الشهير و find و includes
| 1 | // sort تحتاج دالة مقارنة مع الأرقام |
| 2 | const قيم = [40, 5, 100, 25]; |
| 3 | قيم.sort(); // ❌ [100, 25, 40, 5] — يُرتب كنصوص افتراضياً! |
| 4 | قيم.sort((أ, ب) => أ - ب); // ✅ [5, 25, 40, 100] تصاعدي صحيح |
| 5 | |
| 6 | // find و includes |
| 7 | const وجد = قيم.find(ر => ر > 30); |
| 8 | console.log(وجد); // 40 |
| 9 | console.log(قيم.includes(25)); // true |