مرتب‌سازی آرایه اعداد در JavaScript با متد sort

متد 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);

این روش هم کوتاه‌تر است و هم خوانایی بالایی دارد.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *