الانتقال إلى المحتوى الرئيسي
الوحدة 6 · الدرس 4 من 424/32 في الدورة~12 min
دروس الوحدة (4/4)

فرز

يحتوي فرز مصفوفة في JavaScript على مصيدة كبيرة: sort() يحول المصفوفة الأصلية و ** يتم فرزها بشكل افتراضي كسلاسل **.

الفخ

JS
const nums = [10, 2, 1, 20];
nums.sort();
// [1, 10, 2, 20]   ← !? sorted as strings: "1" < "10" < "2"

للفرز الرقمي عليك تمرير المقارنة (a, b) => number:

  • a - b < 0 → a يأتي أولاً
  • a - b > 0 → b يأتي أولاً
  • a - b === 0 → الطلب لم يتغير
JS
const nums = [10, 2, 1, 20];
nums.sort((a, b) => a - b);
// [1, 2, 10, 20]    ← ascending order

nums.sort((a, b) => b - a);
// [20, 10, 2, 1]    ← descending

فرز الكائنات حسب الحقل

JS
const utenti = [
  { nome: 'Anna', eta: 30 },
  { nome: 'Luca', eta: 12 },
  { nome: 'Sara', eta: 18 },
];

utenti.sort((a, b) => a.eta - b.eta);
// [{Luca,12}, {Sara,18}, {Anna,30}]

بالنسبة للسلاسل، يمكنك مقارنتها بـ localeCompare:

JS
const nomi = ['Bruno', 'aurora', 'Carlo'];
nomi.sort((a, b) => a.localeCompare(b));
// ['aurora', 'Bruno', 'Carlo']

عدم تحوير الأصل

خياران:

JS
// 1) copy + sort
const copia = [...nums].sort((a, b) => a - b);

// 2) toSorted (modern, ES2023)
const ordinati = nums.toSorted((a, b) => a - b);

جربه

تمرين#js.m6.l4.e1
المحاولات: 0جارٍ التحميل…

تحديد `sortAscending(nums)`: إرجاع نسخة جديدة من المصفوفة، مرتبة بترتيب تصاعدي كأرقام. يجب ألا يتغير الأصل.

جارٍ تحميل المحرر…
إظهار التلميح

[...nums].sort((a, b) => a - b)

الحل متاح بعد 3 من المحاولات

تمرين المراجعة

تمرين#js.m6.l4.e2
المحاولات: 0جارٍ التحميل…

حدد `sortByAgeAscending(people)`: بالنظر إلى مصفوفة من { name, age }، قم بإرجاع نسخة جديدة مرتبة حسب العمر تصاعديًا. يجب ألا يتغير الأصل.

جارٍ تحميل المحرر…
إظهار التلميح

[...people].sort((a, b) => a.age - b.age)

الحل متاح بعد 3 من المحاولات