JavaScript Sorting Arrays

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

تابع شیء sort() یک آرایه را برحسب حروف الفبا مرتب می‌کند:


<!DOCTYPE HTML>
<html>
  <body>
    <h2> JavaScript Array Sort </h2>
    <p> The sort() method sorts an array alphabetically. </p>
    <p id = "demo"> </p>
    <script>
      const fruits = ["Banana", "Orange", "Apple", "Mango"];
      fruits.sort();
      document.getElementById("demo").innerHTML = fruits;
    </script>
  </body>
</html>

خروجی:

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

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

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


<!DOCTYPE HTML>
<html>
  <body>
    <h2> JavaScript Array Sort Reverse </h2>
    <p> The reverse() method reverses the elements in an array. </p>
    <p> By combining sort() and reverse() you can sort an array in descending order. </p>
    <p id = "demo"> </p>
    <script>
      const fruits = ["Banana", "Orange", "Apple", "Mango"];
      fruits.sort();
      fruits.reverse();
      document.getElementById("demo").innerHTML = fruits;
    </script>
  </body>
</html>

خروجی:

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

به صورت پیش‌فرض sort() مقادیر را به صورت رشته‌ای مرتب می‌کند. بنابراین برای رشته‌ها به درستی کار می‌کند. اما اگر اعداد را به صورت رشته ذخیره کنیم، آنگاه "25" بزرگتر از "100" خواهد بود. زیرا "2" بزرگتر از "1" است. در نتیجه sort() نتایج اشتباهی را در مرتب کردن اعداد برمی‌گرداند.

با استفاده از یک تابع مقایسه (a compare function) می‌توان این مسئله را اصلاح کرد:


<!DOCTYPE HTML>
<html>
  <body>
    <h2> JavaScript Array Sort </h2>
    <p id = "demo"> </p>
    <script>
      const points = [40, 100, 1, 5, 25, 10];
      points.sort(function(a, b){return a - b});
      document.getElementById("demo").innerHTML = points;
    </script>
  </body>
</html>

خروجی:

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

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

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

اگر نتیجه منفی باشد، a قبل از b قرار می‌گیرد.

اگر نتیجه مثبت باشد، b قبل از a قرار می‌گیرد.

اگر نتیجه صفر باشد، در این حالت تغییری در مرتب کردن آن‌ها رخ نمی‌دهد.

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

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

مرتب کردن عناصر یک آرایه به صورت تصادفی

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

البته روش بالا خیلی دقیق نیست و بعضی از اعداد را به دیگری ترجیح می‌دهد. محبوب‌ترین روش درست، به روش Fisher Yates shuffle مشهور است که در سال 1938 در علوم داده معرفی شد!

const points = [40, 100, 1, 5, 25, 10];
for (let i = points.length -1; i > 0; i--) {
let j = Math.floor(Math.random() * i)
let k = points[i]
points[i] = points[j]
points[j] = k
}

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

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

const 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

راه درست برای پیدا کردن بزرگترین مقدار در یک آرایه استفاده از Math.max.apply() است.


<!DOCTYPE HTML>
<html>
  <body>
    <h2> JavaScript Array Sort </h2>
    <p> The highest number is <span id="demo"></span>. </p>
    <script>
      const points = [40, 100, 1, 5, 25, 10];
      document.getElementById("demo").innerHTML = myArrayMax(points);
      function myArrayMax(arr) {
        return Math.max.apply(null, arr);
      }
    </script>
  </body>
</html>

خروجی:

Math.max.apply(null, [1, 2, 3]) معادل Math.max(1, 2, 3) است.

برای پیدا کردن کمترین مقدار در یک آرایه هم می‌توانید از Math.min.apply استفاده کنید. نحوه استفاده از آن همانند Math.max.apply() است.

راه حل سوم هم آن است که خودتان تابعی بنویسید که بتواند بیشترین و کمترین مقدار در یک آرایه را پیدا کند. در زیر یک تابع نمونه برای پیدا کردن بیشترین مقدار آورده شده است.

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

مرتب کردن ارایه‌های دارای شیء

const 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;
});