JavaScript Sorting Arrays
مرتب کردن یک آرایه
تابع شیء sort()
یک آرایه را برحسب حروف الفبا مرتب میکند:
برعکس کردن ترتیب عناصر یک آرایه
تابع شیء reverse()
ترتیب عناصر یک آرایه را برعکس میکند.
در مثال زیر با استفاده از sort()
و reverse()
عناصر در یک روند نزولی مرتب شدهاند.
مرتب کردن آرایههای عددی
به صورت پیشفرض sort()
مقادیر را به صورت رشتهای مرتب میکند. بنابراین برای رشتهها به درستی کار میکند. اما اگر اعداد را به صورت رشته ذخیره کنیم، آنگاه "25" بزرگتر از "100" خواهد بود. زیرا "2" بزرگتر از "1" است. در نتیجه sort()
نتایج اشتباهی را در مرتب کردن اعداد برمیگرداند.
با استفاده از یک تابع مقایسه (a compare function) میتوان این مسئله را اصلاح کرد:
توضیح نحوه عملکرد تابع مقایسه: تابع مقایسه باید بر اساس آرگومانهای آن، یک مقدار منفی، صفر و یا مثبت را برگرداند:
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()
است.
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;
});