متد sort که روی Prototype آرایهها در JavaScript قرار دارد، به شما اجازه میدهد عناصر یک آرایه را مرتب کنید و نحوه مرتبسازی را کنترل کنید. هدف این مطلب این است که توضیح دهد چرا و چگونه متد sort هنگام مرتبسازی آرایهای از اعداد کار میکند.
خلاصه سریع (TL;DR)
برای مرتبسازی صعودی آرایه اعداد از این کد استفاده کنید:
myArray.sort((a, b) => a - b);
آرایهها در JavaScript
آرایهها در JavaScript ساختار دادهای هستند که مجموعهای از دادهها را نگهداری میکنند. چون JavaScript یک زبان بدون type ثابت است، آرایهها میتوانند شامل انواع مختلفی از دادهها باشند؛ مثل:
- رشته (String)
- عدد (Number)
- مقدار
undefined - و انواع دیگر
البته معمولاً بهتر است همه عناصر آرایه از یک نوع باشند.
مرتبسازی آرایهها
یکی از عملیات مهم روی آرایهها، مرتبسازی است. برای مثال:
- پیدا کردن بهترین نمرهها
- مرتب کردن سود شرکتها
- مرتبسازی میزان مصرف داده
- و بسیاری کاربردهای دیگر
همه اینها به نوعی نیازمند مرتبسازی دادهها هستند.
ساخت آرایه نمونه
در مثال زیر، ابتدا آرایهای به نام eggsInNest میسازیم و آن را با مقدار null پر میکنیم:
let eggsInNest = new Array(10).fill(null);
سپس آرایه را با اعداد تصادفی بین 1 تا 200 پر میکنیم:
eggsInNest = eggsInNest.map(() => (
Math.floor(Math.random() * 200) + 1
));
استفاده از sort
اکنون میتوانیم متد sort را بدون پارامتر صدا بزنیم:
eggsInNest.sort();
// مثال خروجی:
[109, 136, 156, 188, 19, 190, 2, 34, 55, 90]
اما نتیجه درست نیست!
چرا sort بهدرستی اعداد را مرتب نمیکند؟
بهصورت پیشفرض، متد sort():
- دادهها را صعودی مرتب میکند
- اما عناصر را ابتدا به String تبدیل میکند
یعنی اعداد مثل رشته مقایسه میشوند، نه عدد واقعی.
برای همین:
"19" < "2"
چون مقایسه رشتهای انجام میشود.
استفاده از تابع مقایسه (Comparison Function)
برای حل این مشکل باید تابع مقایسه به sort بدهیم.
این تابع دو پارامتر دریافت میکند:
function sortEggsInNest(a, b) {
if (a > b) {
return 1;
} else if (b > a) {
return -1;
} else {
return 0;
}
}
سپس:
eggsInNest.sort(sortEggsInNest);
اکنون آرایه بهدرستی بهصورت صعودی مرتب میشود.
نسخه کوتاهتر با عملگر ternary
میتوانید همان تابع را کوتاهتر بنویسید:
function sortEggsInNest(a, b) {
return a > b ? 1 : b > a ? -1 : 0;
}
مرتبسازی نزولی
برای مرتبسازی نزولی فقط کافی است مقادیر 1 و -1 را جابهجا کنید:
function sortEggsInNest(a, b) {
if (a > b) {
return -1;
} else if (b > a) {
return 1;
} else {
return 0;
}
}
یا نسخه کوتاه:
function sortEggsInNest(a, b) {
return a > b ? -1 : b > a ? 1 : 0;
}
روش کوتاهتر برای اعداد
برای آرایههای عددی میتوانید خیلی سادهتر بنویسید:
eggsInNest.sort((a, b) => a - b);
این روش فقط برای دادههای عددی مناسب است، چون:
- اگر
a - bمثبت باشد →aبعد ازbقرار میگیرد - اگر منفی باشد →
aقبل ازb - اگر صفر باشد → برابر هستند
این تکنیک برای:
- اعداد
- یا آبجکتهایی که
valueOf()عدد برمیگرداند (مثلDate)
قابل استفاده است.
جمعبندی
متد sort() در JavaScript بهصورت پیشفرض دادهها را رشتهای مرتب میکند؛ به همین دلیل مرتبسازی اعداد بدون تابع مقایسه معمولاً نتیجه درستی ندارد.
بهترین و رایجترین روش برای مرتبسازی آرایههای عددی:
myArray.sort((a, b) => a - b);
و برای مرتبسازی نزولی:
myArray.sort((a, b) => b - a);
این روش هم کوتاهتر است و هم خوانایی بالایی دارد.
نظرات کاربران