Array.prototype.sort()‎

من موسوعة حسوب
مراجعة 11:51، 27 ديسمبر 2017 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الدالة Array.prototype.sort()‎ ترتِّب عناصر المصفوفة وتغيّر المصفوفة الأصلية وتُعيد المصفوفة المُعدَّلة، وليس من الضروري أن يكون الترتيب «ثابتًا»، وخوارزمية الترتيب الافتراضية المستخدمة ستُرتِّب العناصر اعتمادًا على رموز يونيكود.

الوقت والذاكرة التي تستهلكها عملية الترتيب لا يمكن تحديدها بدقة لأنها تعتمد على المتصفح ونظام التشغيل...

var fruit = ['cherries', 'apples', 'bananas'];
fruit.sort(); // ['apples', 'bananas', 'cherries']

var scores = [1, 10, 21, 2]; 
scores.sort(); // [1, 10, 2, 21]
// لاحظ أنَّ العدد 10 يأتي قبل 2
// ذلك لأنَّ "10" هو ناتج دمج المحرفين "1" و "0" والمحرف "1" يأتي قبل "2" في يونيكود

var things = ['word', 'Word', '1 Word', '2 Words'];
things.sort(); // ['1 Word', '2 Words', 'Word', 'word']
// الأرقام تأتي قبل الأحرف الكبيرة في يونيكود، والتي تأتي بدورها قبل الأحرف الصغيرة

البنية العامة

arr.sort([compareFunction])

compareFunction

تحديد الدالة التي تُعرِّف خوارزمية الترتيب، وإن لم تُحدَّد قيمة لهذا المعامل فستُرتَّب المصفوفة وفقًا لرموز يونيكود، وذلك بعد تحويل عناصر المصفوفة إلى سلاسل نصية.

القيمة المعادة

المصفوفة المرتبة، لاحظ أنَّ المصفوفة الأصلية ستتغيّر أيضًا.

الوصف

إذا لم توفَّر الدالة compareFunction، فستُرتَّب العناصر عبر تحويلها إلى سلاسل نصية ومُقارنة تلك السلاسل عبر ترتيب المحارف في يونيكود. على سبيل المثال، الكلمة "Banana" ستأتي قبل "cherry"؛ وعند ترتيب الأرقام، سيأتي الرقم 9 بعد الرقم 80، ذلك لأنَّ الأرقام ستحوَّل إلى سلاسل نصية، ولأنَّ "80" سيسبق "9" في الترتيب.

إذا وفِّرَت الدالة compareFunction فستُرتَّب عناصر المصفوفة اعتمادًا على القيمة المُعادة من دالة الترتيب، فلو كنّا نرتِّب العنصرين a و b:

  • إذا كانت نتيجة الدالة compareFunction(a, b)‎ أقل من 0، فسيكون ترتيب a في فهرسٍ أقل من فهرس العنصر b، أي أنَّ a تأتي أولًا.
  • إذا كانت نتيجة الدالة compareFunction(a, b)‎ تساوي 0، فسيبقى مكان a و b نفسه نسبةً إلى بعضهما بعضًا، لكن ستستمر عملية مقارنتهما مع العناصر الأخرى.
  • إذا كانت نتيجة الدالة compareFunction(a, b)‎ أكبر من 0، فسيكون ترتيب a في فهرسٍ أكبر من فهرس العنصر b، أي أنَّ b تأتي أولًا.

أي أنَّ دالة الترتيب تأخذ الشكل الآتي:

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a == b
  return 0;
}

فلو أردنا مقارنة الأرقام بدلًا من السلاسل النصية، فيمكن أن تُعيد دالة المقارنة ناتج طرح b من a؛ فالدالة الآتية تُرتِّب عناصر المصفوفة تصاعديًا (إن لم تحتوِ على Infinity أو NaN):

function compareNumbers(a, b) {
  return a - b;
}

يمكننا استخدام الدالة sort مع تعابير تعريف الدوال:

var numbers = [4, 2, 5, 1, 3];
numbers.sort(function(a, b) {
  return a - b;
});
console.log(numbers);

// [1, 2, 3, 4, 5]

يمكن ترتيب الكائنات اعتمادًا على قيمة إحدى الخاصيات:

var items = [
  { name: 'Edward', value: 21 },
  { name: 'Sharpe', value: 37 },
  { name: 'And', value: 45 },
  { name: 'The', value: -12 },
  { name: 'Magnetic', value: 13 },
  { name: 'Zeros', value: 37 }
];

// الترتيب وفق القيمة
items.sort(function (a, b) {
  return a.value - b.value;
});

// الترتيب وفق الاسم
items.sort(function(a, b) {
  var nameA = a.name.toUpperCase(); // تجاهل حالة الأحرف
  var nameB = b.name.toUpperCase(); // تجاهل حالة الأحرف
  if (nameA < nameB) {
    return -1;
  }
  if (nameA > nameB) {
    return 1;
  }

  // الأسماء متساوية
  return 0;
});

أمثلة

المثال الآتي يُنشِئ أربع مصفوفات ويعرض المصفوفة الأصلية، ثم المصفوفات المرتبة. لاحظ أننا رتبنا المصفوفات الرقمية بخوارزمية الترتيب الافتراضية ثم بدالة مقارنة خاصة:

var stringArray = ['Blue', 'Humpback', 'Beluga'];
var numericStringArray = ['80', '9', '700'];
var numberArray = [40, 1, 5, 200];
var mixedNumericArray = ['80', '9', '700', 40, 1, 5, 200];

function compareNumbers(a, b) {
  return a - b;
}

console.log('stringArray:', stringArray.join());
console.log('Sorted:', stringArray.sort());

console.log('numberArray:', numberArray.join());
console.log('Sorted without a compare function:', numberArray.sort());
console.log('Sorted with compareNumbers:', numberArray.sort(compareNumbers));

console.log('numericStringArray:', numericStringArray.join());
console.log('Sorted without a compare function:', numericStringArray.sort());
console.log('Sorted with compareNumbers:', numericStringArray.sort(compareNumbers));

console.log('mixedNumericArray:', mixedNumericArray.join());
console.log('Sorted without a compare function:', mixedNumericArray.sort());
console.log('Sorted with compareNumbers:', mixedNumericArray.sort(compareNumbers));

يُظهِر المثال السابق الناتج الآتي:

stringArray: Blue,Humpback,Beluga
Sorted: Beluga,Blue,Humpback

numberArray: 40,1,5,200
Sorted without a compare function: 1,200,40,5
Sorted with compareNumbers: 1,5,40,200

numericStringArray: 80,9,700
Sorted without a compare function: 700,80,9
Sorted with compareNumbers: 9,80,700

mixedNumericArray: 80,9,700,40,1,5,200
Sorted without a compare function: 1,200,40,5,700,80,9
Sorted with compareNumbers: 1,5,9,40,80,200,700

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي نعم نعم نعم نعم نعم

مصادر ومواصفات