JavaScript:مرتب سازی آرایه ها در جاوا اسکریپت

از ویکی کد
پرش به ناوبری پرش به جستجو

الگو:منو عمودی جاوااسکریپت

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

متد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}
میانبر:
الگو:اصلاح ترجمه بخش

The compare function compares all the values in the array, two values at a time (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;
});

منابع آموزشی

الگو:منو افقی جاوااسکریپت