مرتب‌سازی آرایه‌ها

از موتو کد، دانشنامهٔ برنامه‌نویسی


مرتب کردن یک آرایه[ویرایش | ویرایش]

متد toString() یک آرایه را بر حسب حروف الفبا مرتب می‌کند:[۱]

مثال[ویرایش | ویرایش]

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // Sorts the elements of fruits


مشاهدهٔ نتیجه


برعکس کردن یک آرایه[ویرایش | ویرایش]

متد reverse() عناصر یک آرایه را برعکس می‌کند.

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

مثال[ویرایش | ویرایش]

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();        // First sort the elements of fruits
fruits.reverse();     // Then reverse the order of the elements


مشاهدهٔ نتیجه


مرتب سازی عددی[ویرایش | ویرایش]

به صورت پیشفرض، تابع reverse() مقادیری همانند رشته‌های متنی را مرتب می‌کند.

این متد برای رشته‌های متنی بسیار خوب کار می‌کند .(کلمه "Apple" قبل از کلمه "Banana" می‌آید )

اما، اگر عددها همانند رشته‌های متنی مرتب شوند، "۲۵" بزرگتر از عدد "۱۰۰" خواهد بود، زیرا که "۲" از "۱" بزرگتر است.

به همین دلیل، متد sort() در زمانی که برای مرتب‌سازی اعداد استفاده شود موجب بروز نتایج نادرست می‌شود.

شما می‌توانید این مشکل را با یک تابع مقایسه حل کنید:

مثال[ویرایش | ویرایش]

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});


مشاهدهٔ نتیجه


می‌توانید از روش مشابهی برای مرتب‌سازی نزولی یک آرایه استفاده کنید:

مثال[ویرایش | ویرایش]

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});


مشاهدهٔ نتیجه


تابع مقایسه[ویرایش | ویرایش]

هدف از استفاده از تابع مقایسه تعریف یک روش مرتب‌سازی دیگر است.

یک تابع مقایسه می‌بایست یک مقدار منفی، صفر یا مثبت با توجه به آرگومانهایش برگرداند:

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

زمانی که متد sort() دو مقدار را با یک دیگر مقایسه می‌کند، این تابع مقادیر را برای تابع مقایسه ارسال می‌کند و مقادیر را با توجه به مقدار بازگشتی تابع مقایسه (منفی، صفر، مثبت) مرتب می‌کند.

  • اگر نتیجه عددی منفی باشد، عدد a قبل از b مرتب‌سازی می‌شود.
  • اگر نتیجه عدد مثبت باشد، عدد b قبل از a مرتب‌سازی می‌شود.
  • اگر نتیجه صفر باشد، تغییری روی روش مرتب‌سازی دو مقدار اعمال نمی‌شود.

مثال:

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

تابع مقایسه تمامی مقادیر موجود در آرایه را به صورت همزمان و دو به دو (یعنی مقدار a را با b) مقایسه می‌کند.

زمانی که عدد ۴۰ و ۱۰۰ را مقایسه می‌کنیم، متد sort() تابع مقایسه را با مقادیر (۱۰۰، ۴۰) فراخوانی می‌کند.

تابع حاصل ۱۰۰–۴۰ یا (a - b) را محاسبه می‌کند، و ازآنجایی که نتیجه عددی منفی (۶۰-) است، تابع مقایسه عدد ۴۰ را کوچکتر از ۱۰۰ در نظر می‌گیرد.

شما می‌توانید از کد زیر برای درک مفهوم مرتب‌سازی عددی و الفبایی استفاده کنید:

<button onclick="myFunction1()">Sort Alphabetically</button>
<button onclick="myFunction2()">Sort Numerically</button>

<p id="demo"></p>

<script>
var points = [40, 100, 1, 5, 25, 10];
document.getElementById("demo").innerHTML = points;

function myFunction1() {
  points.sort();
  document.getElementById("demo").innerHTML = points;
}

function myFunction2() {
  points.sort(function(a, b){return a - b});
  document.getElementById("demo").innerHTML = points;
}
</script>


مشاهدهٔ نتیجه


مرتب سازی یک آرایه به صورت تصادفی (Random)[ویرایش | ویرایش]

مثال[ویرایش | ویرایش]

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});


مشاهدهٔ نتیجه


پیدا کردن بزرگترین (یا کوچکترین) مقدار آرایه[ویرایش | ویرایش]

هیچ تابع پیشفرضی برای پیدا کردن بزرگترین یا کوچکترین مقدار در یک آرایه وجود ندارد.

اما، بعد از اینکه شما یک آرایه را مرتب کردید، شما می‌توانید با استفاده از اندیس‌ها، کوچکترین و بزرگترین مقدار را تشخیص دهید.

مرتب‌سازی صعودی:

مثال[ویرایش | ویرایش]

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// now points[0] contains the lowest value
// and points[points.length-1] contains the highest value


مشاهدهٔ نتیجه


مرتب‌سازی نزولی:

مثال[ویرایش | ویرایش]

var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// now points[0] contains the highest value
// and points[points.length-1] contains the lowest value


مشاهدهٔ نتیجه


مرتب‌سازی کل یک آرایه فقط برای پیدا کردن بزرگترین (یا کوچکترین) مقدار موجود در آرایه روشی کم بازده است.

استفاده از تابع Math.max() روی یک آرایه[ویرایش | ویرایش]

شما می‌توانید از Math.max.apply برای پیدا کردن بزرگترین عدد در یک آرایه استفاده کنید:

مثال[ویرایش | ویرایش]

function myArrayMax(arr) {
  return Math.max.apply(null, arr);
}


مشاهدهٔ نتیجه


دستور Math.max.apply(null, [1, 2, 3]) با دستور Math.max(1, 2, 3) برابر است.

استفاده از تابع Math.min() روی یک آرایه[ویرایش | ویرایش]

شما می‌توانید از Math.min.apply برای پیدا کردن کمترین عدد در یک آرایه استفاده کنید:

مثال[ویرایش | ویرایش]

function myArrayMin(arr) {
  return Math.min.apply(null, arr);
}


مشاهدهٔ نتیجه


دستور Math.min.apply(null, [1, 2, 3]) با دستور Math.min(1, 2, 3) برابر است.

متد Min و Max من در جاوا اسکریپت[ویرایش | ویرایش]

بهترین روش برای اینکار استفاده از یک «متد شخصی» است.

این تابع یک حلقه دارد که هر مقدار در آرایه را با بزرگترین مقداری که پیدا کند مقایسه می‌کند:

مثال (پیدا کردن Max)[ویرایش | ویرایش]

function myArrayMax(arr) {
  var len = arr.length;
  var max = -Infinity;
  while (len--) {
    if (arr[len] > max) {
      max = arr[len];
    }
  }
  return max;
}


مشاهدهٔ نتیجه


این تابع یک حلقه دارد که هر مقدار در آرایه را با کوچکترین مقداری که پیدا کند مقایسه می‌کند:

مثال (پیدا کردن Min)[ویرایش | ویرایش]


function myArrayMin(arr) {
  var len = arr.length;
  var min = Infinity;
  while (len--) {
    if (arr[len] < min) {
      min = arr[len];
    }
  }
  return min;
}


مشاهدهٔ نتیجه


مرتب سازی آرایه اشیاء[ویرایش | ویرایش]

آرایه‌های جاوا اسکریپت اغلب شامل اشیاء نیز می‌شوند:

مثال[ویرایش | ویرایش]

var cars = [
  {type:"Volvo", year:2016},
  {type:"Saab", year:2001},
  {type:"BMW", year:2010}
];

حتی اگر اشیا ویژگی‌های دیگری از نوع داده‌های متفاوت داشته باشند، متد sort() می‌تواند برای مرتب‌سازی این نوع آرایه‌ها نیز استفاده شود.

راه حل این مشکل نوشتن یک تابع مقایسه برای مقایسه مقادیر ویژگی‌ها است:

مثال[ویرایش | ویرایش]

cars.sort(function(a, b){return a.year - b.year});


مشاهدهٔ نتیجه


مقایسه ویژگی‌های مقادیر رشته‌ای با روشی کمی پیچیده‌تر:

مثال[ویرایش | ویرایش]

cars.sort(function(a, b){
  var x = a.type.toLowerCase();
  var y = b.type.toLowerCase();
  if (x < y) {return -1;}
  if (x > y) {return 1;}
  return 0;
});


مشاهدهٔ نتیجه


تمرینات جاوا اسکریپت[ویرایش | ویرایش]

Time2wait.svg ساخت نمونه مثال این بخش در دست اقدام است.



منابع آموزشی[ویرایش]