javascriptsort and reverseمرتبسازی و وارونهسازی آرایه در جاوااسکریپت
آرایه را در جاوااسکریپت با مقایسهگر عددی مرتب کنید؛ رفتار پیشفرض sort، تغییر منبع، reverse و حفظ ترتیب نسبی مقدارهای برابر را ببینید.
مفهوم به زبان ساده
مرتبکردن قیمتها با مرتبکردن نامها یک قرارداد یکسان ندارد. sort بدون تابع مقایسه، مقدارها را برای ترتیب پیشفرض به رشته تبدیل میکند؛ به همین دلیل ممکن است عدد ۱۰۰ پیش از ۸ قرار بگیرد. برای عددهای معتبر و معمول، تابعی مانند (a, b) => a - b ترتیب صعودی را بیان میکند. نتیجهٔ منفی، مثبت یا صفرِ مقایسهگر جای نسبی دو عضو را تعیین میکند.
sort و reverse خود آرایه را تغییر میدهند. در مثال، برای حفظ فهرست اصلی، پیش از مرتبسازی و وارونهکردن یک کپی سطحی میسازیم. reverse فقط ترتیب فعلی را برعکس میکند؛ بهتنهایی معنای مرتبسازی نزولی ندارد. اگر پیش از آن ترتیب صعودی ساخته باشیم، وارونهٔ آن نزولی خواهد بود. در کد واقعی میتوانید مقایسهگر نزولی را هم مستقیم بنویسید.
مرتبسازی پایدار، ترتیب نسبی دو عضو با نتیجهٔ مقایسهٔ صفر را حفظ میکند؛ نمونهٔ ردیفها این رفتار را نشان میدهد. برای عنوان فارسی، سیاست مقایسهٔ زبانی را با Intl.Collator بررسی کنید و از مقایسهگر عددی استفاده نکنید. همچنین دادههای نامعتبر مانند NaN را پیش از مرتبسازی مدیریت کنید. برای تمرین، قیمت تکراری اضافه کنید و توضیح دهید نتیجهٔ برابر چه اثری بر ترتیب ردیفها دارد.
کجا به کار میآید؟
- مرتبکردن قیمت یا امتیاز با معیار عددی روشن
- نمایش وارونهٔ یک فهرست بدون تغییر نسخهٔ اصلی
از تعریف تا یک مثال واقعی
const prices = [90, 100, 8];
console.log([...prices].sort().join(', '));
const ascending = [...prices].sort((a, b) => a - b);
console.log(ascending.join(', '));
console.log([...ascending].reverse().join(', '));
console.log(prices.join(', '));
const rows = [{ id: 'a', rank: 2 }, { id: 'b', rank: 1 }, { id: 'c', rank: 2 }];
console.log([...rows].sort((a, b) => a.rank - b.rank).map((row) => row.id).join(', '));
100, 8, 90 8, 90, 100 100, 90, 8 90, 100, 8 b, a, c
این مثال چطور کار میکند؟
ترتیب پیشفرض، عددها را مانند متن مقایسه میکند.
مقایسهگر a - b ترتیب عددی صعودی میدهد.
کپیِ آرایهٔ مرتب وارونه میشود و منبع اولیه حفظ میشود.
دو ردیف با rank برابر دو، ترتیب a پیش از c را نگه میدارند.
اشتباه رایج
از sort انتظار آرایهٔ مستقل نداشته باشید؛ همان منبع را مرتب میکند. مقایسهگر بولی مثل a > b هم قرارداد کامل منفی، صفر و مثبت را درست بیان نمیکند.
این را به خاطر بسپارید
معیار مقایسه و مجازبودن تغییر منبع را پیش از مرتبسازی مشخص کنید.