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

از ویکی‌کد
پرش به ناوبری پرش به جستجو
Main Page Tutorial
JavaScript-menu.png
موارد آموزشی
فرم‌ها در جاوا اسکریپت
اشیاء در جاوا اسکریپت
تابع در جاوا اسکریپت
HTML DOM در جاوا اسکریپت
Browser BOM در جاوا اسکریپت
AJAX در جاوا اسکریپت
JSON در جاوا اسکریپت
جی‌کوئری در برابر جاوا اسکریپت
مرجع جاوا اسکریپت

مرتب کردن یک آرایه

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

مثال

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


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


برعکس کردن یک آرایه

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

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

مثال

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


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


مرتب سازی عددی

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

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

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

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

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

مثال

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


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


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

مثال

1 var points = [40, 100, 1, 5, 25, 10];
2 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) را محاسبه می‌کند، و ازآنجایی که نتیجه عددی منفی (۶۰-) است، تابع مقایسه عدد ۴۰ را کوچکتر از ۱۰۰ در نظر می‌گیرد.

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

 1 <button onclick="myFunction1()">Sort Alphabetically</button>
 2 <button onclick="myFunction2()">Sort Numerically</button>
 3 
 4 <p id="demo"></p>
 5 
 6 <script>
 7 var points = [40, 100, 1, 5, 25, 10];
 8 document.getElementById("demo").innerHTML = points;
 9 
10 function myFunction1() {
11   points.sort();
12   document.getElementById("demo").innerHTML = points;
13 }
14 
15 function myFunction2() {
16   points.sort(function(a, b){return a - b});
17   document.getElementById("demo").innerHTML = points;
18 }
19 </script>


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


مرتب سازی یک آرایه به صورت تصادفی (به انگلیسی: Random)

مثال

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


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


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

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

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

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

مثال

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


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


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

مثال

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


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


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

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

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

مثال

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


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


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

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

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

مثال

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


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


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

متد Min و Max من در جاوا اسکریپت

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

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

مثال (پیدا کردن Max)

 1 function myArrayMax(arr) {
 2   var len = arr.length;
 3   var max = -Infinity;
 4   while (len--) {
 5     if (arr[len] > max) {
 6       max = arr[len];
 7     }
 8   }
 9   return max;
10 }


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


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

مثال (پیدا کردن Min)


 1 function myArrayMin(arr) {
 2   var len = arr.length;
 3   var min = Infinity;
 4   while (len--) {
 5     if (arr[len] < min) {
 6       min = arr[len];
 7     }
 8   }
 9   return min;
10 }


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


مرتب سازی آرایه اشیاء

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

مثال

1 var cars = [
2   {type:"Volvo", year:2016},
3   {type:"Saab", year:2001},
4   {type:"BMW", year:2010}
5 ];

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

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

مثال

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


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


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

مثال

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


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


تمرینات جاوا اسکریپت

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



منابع آموزشی