مرتب سازی آرایه (Array Sort)
اینجا با «مرتب سازی آرایه» آشنا می شویم. آرایه (Array) یعنی لیست منظم. مرتب سازی یعنی چیدمان دوباره. گاهی حروفی است، گاهی عددی. قدم به قدم جلو می رویم و مثال می زنیم.
مرتب سازی حروفی با sort()
متد sort() آرایه رشته ای را به ترتیب الفبا می چیند. «ایندکس (Index)» همان شماره جایگاه است.
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
برعکس کردن با reverse()
متد reverse() ترتیب را وارونه می کند. می توانی پس از sort استفاده کنی.
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.reverse();
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();
نسخه های امن: toSorted() و toReversed()
متدهای toSorted() و toReversed() اصل آرایه را عوض نمی کنند. نتیجه را در آرایه جدید می دهند.
const months = ["Jan", "Feb", "Mar", "Apr"];
const sorted = months.toSorted();
const months = ["Jan", "Feb", "Mar", "Apr"];
const reversed = months.toReversed();
مرتب سازی عددی با تابع مقایسه
به صورت پیش فرض، sort() مثل رشته می چیند. برای اعداد، «تابع مقایسه (Compare Function)» بده.
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) {
return a - b;
});
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) {
return b - a;
});
نکته: عدد منفی یعنی «a قبل از b». عدد مثبت یعنی «b قبل از a».
مرتب سازی تصادفی و روش درست
این روش ساده، تصادفی کامل نیست؛ اما سریع است.
const points = [40, 100, 1, 5, 25, 10];
points.sort(function() {
return 0.5 - Math.random();
});
روش استاندارد «Fisher-Yates» دقیق تر است و بایاس ندارد.
const points = [40, 100, 1, 5, 25, 10];
for (let i = points.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
let k = points[i];
points[i] = points[j];
points[j] = k;
}
کمینه و بیشینه آرایه
سه راه داری: با sort، با Math، یا با حلقه ساده.
با sort()
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) {
return a - b;
});
const min = points[0];
const max = points[points.length - 1];
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) {
return b - a;
});
const maxTop = points[0];
const minLast = points[points.length - 1];
هشدار: فقط برای پیدا کردن کمینه، sort کارآمد نیست.
با Math.min / Math.max
function myArrayMin(arr) {
return Math.min.apply(null, arr);
}
function myArrayMax(arr) {
return Math.max.apply(null, arr);
}
روش خانگی سریع
function myArrayMin(arr) {
let len = arr.length;
let min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
}
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 }
];
cars.sort(function(a, b) {
return a.year - b.year;
});
cars.sort(function(a, b) {
let x = a.type.toLowerCase();
let y = b.type.toLowerCase();
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
});
مرتب سازی پایدار از ES2019
از ES2019، sort() باید «پایدار (Stable)» باشد. یعنی ترتیب برابرها حفظ می شود.
const myArr = [
{ name: "X00", price: 100 },
{ name: "X01", price: 100 },
{ name: "X02", price: 100 },
{ name: "X03", price: 100 },
{ name: "X04", price: 110 },
{ name: "X05", price: 110 },
{ name: "X06", price: 110 },
{ name: "X07", price: 110 }
];
ادامه مسیر مرتب سازی آرایه
برای جستجو، صفحه مرتب سازی آرایه و تکرار روی آرایه را ببین. سپس تمرین کن و نتایج را مقایسه کن.
جمع بندی سریع
sort()رشته ای می چیند؛ برای عدد، مقایسه بده.reverse()وارونه می کند؛toReversed()امن تر است.toSorted()اصل آرایه را تغییر نمی دهد.- برای تصادفی دقیق، Fisher-Yates بهتر است.
- برای کمینه/بیشینه،
Mathیا حلقه سریع تر است.