JavaScript: المصفوفات المتقدمة في جافاسكريبت
آخر تحديث: 2026-10-13
في الدرس السابق، تعلمت عمليات المصفوفة الأساسية. الآن لنتقدم بـ "حركات القوة" في المصفوفات — أساليب الترتيب الأعلى. هذه تتيح لك فعل المزيد بكود أقل وهي مهارات أساسية في تطوير جافاسكريبت الحديث.
1. map — تحويل كل عنصر
map تُنفذ دالة على كل عنصر وتُرجع مصفوفة جديدة — الأصل يبقى دون تغيير. فكّر فيها كخط إنتاج: كل عنصر يدخل، يتحول، ويخرج كجزء من منتج جديد.
<script>
let prices = [10, 20, 30];
let doubled = prices.map(p => p * 2); // [20, 40, 60]
</script>
الاستدعاء يُرجع ثلاث وسائط: (element, index, originalArray). في معظم الأوقات تحتاج الأولى فقط.
filter تحتفظ بالعناصر التي تجتاز اختبارًا وتُرجع مصفوفة جديدة — الأصل لا يتغير. مثل نقطة تفتيش: العناصر التي تستوفي المعايير تمر; الباقي يُصفّى.
<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 "تضغط" المصفوفة إلى قيمة واحدة. أكثر حالة استخدام شيوعًا هي الجمع:
<script>
let nums = [1, 2, 3, 4, 5];
let sum = nums.reduce((acc, cur) => acc + cur, 0); // 15
</script>
ما تعنيه المعلمات:
acc(المراكم): المجموع الجاري، يُنقل من التكرار السابقcur(الحالي): العنصر الحالي- الوسيط الثاني
0هو القيمة الأولية للمراكم
reduce تبدو صعبة في البداية، لكن جوهرها بسيط: خطوة بخطوة، اضغط المصفوفة إلى قيمة واحدة. الجمع، إيجاد الأعلى، عد التكرارات — reduce تتعامل معها جميعًا.
▶ مثال: دمج map، filter، وreduce
▶ جرّب الكود3. find وfindIndex
إذا لم يُعثر على شيء، find تُرجع undefined وfindIndex تُرجع -1.
<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 تُرتّب المصفوفة في المكان (تُعدّل الأصل!). افتراضيًا تُرتّب كنصوص، وهو ما يوقع كثيرًا من المبتدئين:
<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
some— هل عنصر واحد على الأقل يجتاز الاختبار؟ (تُرجع قيمة منطقية)every— هل جميع العناصر تجتاز الاختبار؟ (تُرجع قيمة منطقية)
<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. عامل الانتشار (...)
عامل الانتشار ... "يفتح" المصفوفة. يُستخدم عادةً للنسخ والدمج:
<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. إزالة الهيكلة
استخرج القيم من المصفوفة وعيّنها للمتغيرات حسب الموضع:
<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. تسلسل الأساليب
أساليب الترتيب الأعلى تُرجع مصفوفات جديدة، لذا يمكنك تسلسلها واحدًا تلو الآخر:
<script>
let result = students
.filter(s => s.score >= 60) // أولاً، فلترة الطلاب الناجحين
.map(s => s.name) // ثم، استخراج الأسماء
.sort(); // أخيرًا، ترتيب
</script>
▶ مثال: تسلسل لمعالجة البيانات
▶ جرّب الكود▶ مثال: عامل الانتشار وإزالة الهيكلة
▶ جرّب الكود❓ أسئلة شائعة
map تُرجع مصفوفة جديدة; forEach تُرجع undefined. استخدم map عندما تحتاج النتيجة، forEach عندما تريد فقط تنفيذ إجراء. لا تستخدم push يدويًا داخل forEach — هذا ما map مصممة له.sort تُعدّل المصفوفة الأصلية؟sort عملية في المكان — تُرتّب العناصر بدلاً من إرجاع مصفوفة جديدة. للحفاظ على الأصل، انسخ أولاً: [...arr].sort(...).reduce؟📖 ملخص
mapتُحوّل كل عنصر إلى مصفوفة جديدة،filterتحتفظ بالعناصر المتطابقة،reduceتتراكم إلى قيمة واحدةfindتُرجع أول عنصر متطابق،findIndexتُرجع أول فهرس متطابقsortافتراضيًا تُرتّب نصيًا — للأرقام، مرر دائمًا دالة مقارنة:(a, b) => a - bsomeتتحقق مما إذا كان أي عنصر يتطابق،everyتتحقق مما إذا كانت جميع العناصر تتطابق- عامل الانتشار
...ينسخ ويدمج المصفوفات; إزالة الهيكلة تستخرج العناصر في متغيرات - أساليب الترتيب الأعلى تُرجع مصفوفات جديدة ويمكن تسلسلها لكود مختصر ومقروء
📝 تمارين
- بالنظر إلى المصفوفة
[3, 8, 12, 5, 9, 17, 4]، استخدمfilterللاحتفاظ بالأرقام أكبر من 7، ثمmapلمضاعفتها. أخرج النتيجة. - استخدم
reduceلعد تكرارات كل كلمة في مصفوفة مثل['تفاحة', 'موزة', 'تفاحة', 'كرز', 'موزة', 'تفاحة']→{ تفاحة: 3, موزة: 2, كرز: 1 }. - بالنظر إلى مصفوفة طلاب (مع
nameوscore)، استخدم التسلسل لـ: فلترة الطلاب الناجحين ← ترتيب حسب الدرجة تنازليًا ← استخراج الأسماء في مصفوفة جديدة. اعرض النتيجة على الصفحة.