🗃️ ترتيب المصفوفات في جافا سكريبت: دليلك الشامل لاستخدام sort()
تخيل أن لديك قائمة من الأسماء أو الأسعار مكتوبة بشكل عشوائي في برنامجك. كيف تجعلها مرتبة؟ الجواب يكمن في واحدة من أقوى الدوال المدمجة في جافا سكريبت: دالة sort(). في هذا الدرس، سنتعلم بالتفصيل كيفية استخدام هذه الدالة لترتيب عناصر أي مصفوفة بكل سهولة.
🔍 ما هي دالة sort()؟
دالة sort() هي دالة مدمجة (Built-in Function) في جافا سكريبت خاصة بالمصفوفات (Arrays). وظيفتها الأساسية هي إعادة ترتيب عناصر المصفوفة الأصلية وتعديلها مباشرة (وهذا ما يسمى "التعديل في المكان" أو In-Place)، ثم تعيد المصفوفة المرتبة نفسها.
بناء الجملة (Syntax) بسيط جداً:
array.sort()
أو مع دالة مقارنة:
array.sort(compareFunction)
📝 الترتيب الافتراضي: ترتيب النصوص أبجدياً
عند استدعاء sort() بدون أي معاملات (أي بدون compareFunction)، تقوم الدالة بتحويل جميع العناصر إلى نصوص (strings) وترتيبها بناءً على قيمتها وفق تسلسل Unicode، والذي يتوافق عملياً مع الترتيب الأبجدي للنصوص الإنجليزية.
لنرى مثالاً عملياً:
// مثال 1: ترتيب قائمة أسماء
let students = ["Sara", "Ahmed", "Ziad", "Mariam"];
students.sort();
console.log(students); // المخرجات: ['Ahmed', 'Mariam', 'Sara', 'Ziad']
// تم الترتيب أبجدياً حسب الحرف الأول
// مثال 2: ترتيب حروف عشوائية
let letters = ["z", "c", "a", "b"];
letters.sort();
console.log(letters); // المخرجات: ['a', 'b', 'c', 'z']
ملاحظة هامة: لأن الدالة تعدل المصفوفة الأصلية، فإن المصفوفة students و letters قد تغيرت بشكل دائم بعد استدعاء sort().
⚠️ المشكلة الكبرى: ترتيب الأرقام!
هنا تكمن المفاجأة الأكثر شيوعاً للمبتدئين. بما أن الدالة الافتراضية تحول كل شيء إلى نص، فإن ترتيب الأرقام بهذه الطريقة يعطي نتائج غير متوقعة!
انظر إلى هذا المثال:
let numbers = [10, 5, 100, 2, 50];
numbers.sort();
console.log(numbers); // المخرجات: [10, 100, 2, 5, 50]
ماذا حدث؟ 🤔 لم يتم ترتيب الأرقام تصاعدياً (2, 5, 10, 50, 100). بدلاً من ذلك، تمت معاملتها كنصوص وترتيبها أبجدياً حسب أول حرف:
- "10" تأتي قبل "2" لأن الحرف "1" يأتي قبل "2" في التسلسل النصي.
- "100" تأتي قبل "2" لنفس السبب.
✅ الحل: استخدام "دالة المقارنة" (Compare Function)
لترتيب الأرقام (أو أي عناصر بطريقة مخصصة)، نحتاج إلى تمرير دالة مقارنة compareFunction كمعامل للدالة sort().
دالة المقارنة هي دالة تأخذ قيمتين (عادة نسميهما a و b) وتعيد رقمًا يخبر دالة sort() بكيفية ترتيب هاتين القيمتين.
قاعدة الترتيتب تعتمد على القيمة المعادة:
- إذا أعادت الدالة رقماً سالباً (أقل من الصفر): يتم وضع
aقبلb. - إذا أعادت الدالة رقماً موجباً (أكبر من الصفر): يتم وضع
bقبلa. - إذا أعادت الدالة صفر (0): يبقى ترتيب
aوbكما هو.
🔢 ترتيب الأرقام تصاعدياً وتنازلياً
لنطبق القاعدة لإنشاء دوال مقارنة شائعة:
1. الترتيب التصاعدي (من الأصغر إلى الأكبر)
let numbers = [10, 5, 100, 2, 50];
// الدالة التي ترتب الأرقام تصاعدياً
numbers.sort(function(a, b) {
return a - b; // إذا كانت a أصغر من b، تكون النتيجة سالبة فتوضع a أولاً
});
console.log(numbers); // المخرجات: [2, 5, 10, 50, 100]
2. الترتيب التنازلي (من الأكبر إلى الأصغر)
let scores = [88, 95, 70, 100, 60];
// الدالة التي ترتب الأرقام تنازلياً
scores.sort(function(a, b) {
return b - a; // عكس العملية: إذا كانت b أكبر من a، تكون النتيجة موجبة فتوضع b أولاً
});
console.log(scores); // المخرجات: [100, 95, 88, 70, 60]
🎯 مثال شامل: ترتيب منتجات بمعلوماتها
لنخلق مثالاً أقرب للواقع. افترض أن لديك مصفوفة من الكائنات (Objects) تمثل منتجات، وتريد ترتيبها حسب السعر.
let products = [
{ name: "كتاب", price: 30 },
{ name: "قلم", price: 5 },
{ name: "حاسوب", price: 1500 }
];
// نرتب المنتجات من الأرخص إلى الأغلى (تصاعدياً حسب السعر)
products.sort(function(productA, productB) {
return productA.price - productB.price;
});
console.log(products);
/* المخرجات:
[
{ name: 'قلم', price: 5 },
{ name: 'كتاب', price: 30 },
{ name: 'حاسوب', price: 1500 }
]
*/
💡 ملخص سريع ونصائح مهمة
sort()تعدل المصفوفة الأصلية مباشرة.- الترتيب الافتراضي أبجدي/نصي، وهو غير مناسب للأرقام.
- لترتيب الأرقام، استخدم دالة مقارنة:
return a - bللتصاعدي،return b - aللتنازلي. - دالة المقارنة هي قلب عملية الترتيب المخصصة لأي نوع من البيانات.
🎓 اختبر نفسك
التعليقات
شاركنا رأيك أو أسئلتك حول هذا المقال