JavaScript: المصفوفات المتقدمة في جافاسكريبت

آخر تحديث: 2026-10-13

في الدرس السابق، تعلمت عمليات المصفوفة الأساسية. الآن لنتقدم بـ "حركات القوة" في المصفوفات — أساليب الترتيب الأعلى. هذه تتيح لك فعل المزيد بكود أقل وهي مهارات أساسية في تطوير جافاسكريبت الحديث.

دوال المصفوفات ذات صلة:findIndex forEach filter reduce every find push some sort map

1. map — تحويل كل عنصر

map تُنفذ دالة على كل عنصر وتُرجع مصفوفة جديدة — الأصل يبقى دون تغيير. فكّر فيها كخط إنتاج: كل عنصر يدخل، يتحول، ويخرج كجزء من منتج جديد.

HTML
<script>
let prices = [10, 20, 30];
let doubled = prices.map(p => p * 2);   // [20, 40, 60]
</script>

الاستدعاء يُرجع ثلاث وسائط: (element, index, originalArray). في معظم الأوقات تحتاج الأولى فقط.


filter تحتفظ بالعناصر التي تجتاز اختبارًا وتُرجع مصفوفة جديدة — الأصل لا يتغير. مثل نقطة تفتيش: العناصر التي تستوفي المعايير تمر; الباقي يُصفّى.

HTML
<script>
let scores = [45, 80, 92, 55, 78, 98];
let passed = scores.filter(s => s >= 60);  // [80, 92, 78, 98]
</script>

العناصر التي يُرجع فيها الاستدعاء true تُحتفظ; تلك التي يُرجع false تُهمل.


2. reduce — تراكم إلى قيمة واحدة

reduce "تضغط" المصفوفة إلى قيمة واحدة. أكثر حالة استخدام شيوعًا هي الجمع:

HTML
<script>
let nums = [1, 2, 3, 4, 5];
let sum = nums.reduce((acc, cur) => acc + cur, 0);  // 15
</script>

ما تعنيه المعلمات:

💡 تلميح: reduce تبدو صعبة في البداية، لكن جوهرها بسيط: خطوة بخطوة، اضغط المصفوفة إلى قيمة واحدة. الجمع، إيجاد الأعلى، عد التكرارات — reduce تتعامل معها جميعًا.

▶ مثال: دمج map، filter، وreduce

▶ جرّب الكود

3. find وfindIndex

إذا لم يُعثر على شيء، find تُرجع undefined وfindIndex تُرجع -1.

HTML
<script>
let users = [
  { name: 'سارة', age: 20 },
  { name: 'أحمد', age: 17 },
  { name: 'محمد', age: 25 }
];

users.find(u => u.age > 22);       // { name: 'محمد', age: 25 }
users.findIndex(u => u.age < 18);  // 1 (فهرس أحمد)
</script>

4. sort — ترتيب العناصر

sort تُرتّب المصفوفة في المكان (تُعدّل الأصل!). افتراضيًا تُرتّب كنصوص، وهو ما يوقع كثيرًا من المبتدئين:

HTML
<script>
let nums = [10, 1, 21, 2];
nums.sort();           // [1, 10, 2, 21]  ← ترتيب نصي! "10" < "2"

// الصحيح: الترتيب العددي يحتاج دالة مقارنة
nums.sort((a, b) => a - b);   // [1, 2, 10, 21]  ← تصاعدي
nums.sort((a, b) => b - a);   // [21, 10, 2, 1]  ← تنازلي
</script>
⚠️ ملاحظة: sort تُعدّل المصفوفة الأصلية! للحفاظ على الأصل سليمًا، انسخ أولاً: [...arr].sort(...).

▶ مثال: ترتيب درجات الطلاب

▶ جرّب الكود

5. some وevery

HTML
<script>
let scores = [60, 75, 82, 90];

scores.some(s => s >= 90);    // true  — شخص حصل على 90+
scores.some(s => s === 100);  // false — لم يحصل أحد على درجة كاملة
scores.every(s => s >= 60);   // true  — الجميع ناجحون
</script>
💡 تلميح: some تسأل "هل هناك من..."، بينما every تسأل "هل الجميع...". واحدة تتحقق من الوجود; الأخرى تتحقق من الاكتمال.


6. عامل الانتشار (...)

عامل الانتشار ... "يفتح" المصفوفة. يُستخدم عادةً للنسخ والدمج:

HTML
<script>
let a = [1, 2, 3];
let b = [...a];          // نسخ: [1, 2, 3] (مصفوفة جديدة، ليست مرجعًا)
let c = [...a, 4, 5];    // دمج: [1, 2, 3, 4, 5]
let d = [0, ...a, 4];    // إدراج: [0, 1, 2, 3, 4]

let x = [1, 2], y = [3, 4];
let z = [...x, ...y];    // [1, 2, 3, 4]
</script>

7. إزالة الهيكلة

استخرج القيم من المصفوفة وعيّنها للمتغيرات حسب الموضع:

HTML
<script>
let [a, b, c] = [1, 2, 3];
// a = 1, b = 2, c = 3

let [first, ...rest] = [1, 2, 3, 4, 5];
// first = 1, rest = [2, 3, 4, 5]

let [name, score] = ['سارة', 95];
// name = 'سارة', score = 95
</script>
💡 تلميح: إزالة الهيكلة تبقي الكود مختصرًا. عندما تُرجع الدالة عدة قيم، لفّها في مصفوفة وإزالة الهيكلة هو نمط شائع.


8. تسلسل الأساليب

أساليب الترتيب الأعلى تُرجع مصفوفات جديدة، لذا يمكنك تسلسلها واحدًا تلو الآخر:

HTML
<script>
let result = students
  .filter(s => s.score >= 60)     // أولاً، فلترة الطلاب الناجحين
  .map(s => s.name)               // ثم، استخراج الأسماء
  .sort();                         // أخيرًا، ترتيب
</script>

▶ مثال: تسلسل لمعالجة البيانات

▶ جرّب الكود

▶ مثال: عامل الانتشار وإزالة الهيكلة

▶ جرّب الكود

دوال المصفوفات ذات صلة:findIndex forEach filter reduce every find push some sort map

❓ أسئلة شائعة

س ما الفرق بين map وforEach؟
ج map تُرجع مصفوفة جديدة; forEach تُرجع undefined. استخدم map عندما تحتاج النتيجة، forEach عندما تريد فقط تنفيذ إجراء. لا تستخدم push يدويًا داخل forEach — هذا ما map مصممة له.
س لماذا sort تُعدّل المصفوفة الأصلية؟
ج إنه خيار تصميم تاريخي. sort عملية في المكان — تُرتّب العناصر بدلاً من إرجاع مصفوفة جديدة. للحفاظ على الأصل، انسخ أولاً: [...arr].sort(...).
س هل يمكنني حذف القيمة الأولية في reduce؟
ج نعم — إذا حُذفت، يصبح العنصر الأول هو القيمة الأولية ويبدأ التكرار من الثاني. لكن مصفوفة فارغة بدون قيمة أولية ستُلقي خطأ، لذا دائمًا أضف واحدة للأمان.

📖 ملخص

📝 تمارين

  1. بالنظر إلى المصفوفة [3, 8, 12, 5, 9, 17, 4]، استخدم filter للاحتفاظ بالأرقام أكبر من 7، ثم map لمضاعفتها. أخرج النتيجة.
  2. استخدم reduce لعد تكرارات كل كلمة في مصفوفة مثل ['تفاحة', 'موزة', 'تفاحة', 'كرز', 'موزة', 'تفاحة'] → { تفاحة: 3, موزة: 2, كرز: 1 }.
  3. بالنظر إلى مصفوفة طلاب (مع name وscore)، استخدم التسلسل لـ: فلترة الطلاب الناجحين ← ترتيب حسب الدرجة تنازليًا ← استخراج الأسماء في مصفوفة جديدة. اعرض النتيجة على الصفحة.
Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%