Array.prototype.sort()
الدالة 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 |
---|---|---|---|---|---|
الدعم الأساسي | نعم | نعم | نعم | نعم | نعم |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.
- معيار ECMAScript 1st Edition.