از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مرتب سازی آرایه ها در جاوا اسکریپت مانند بسیاری از زبان های رایج دیگر، جاوا اسکریپت به راحتی با یک روش داخلی برای مرتب سازی آرایه ها ارائه می شود. در حالی که نتیجه نهایی یکسان است، موتورهای مختلف جاوا اسکریپت این روش را با استفاده از الگوریتمهای مرتبسازی مختلف اجرا میکنند: V8: مرتبسازی سریع یا مرتبسازی درج (برای آرایههای کوچکتر) فایرفاکس: مرتبسازی ادغام سافاری: مرتبسازی سریع، مرتبسازی ادغام یا انتخاب…
سرفصلهای مطلب
مانند بسیاری از زبان های محبوب دیگر، جاوا اسکریپت به راحتی با یک روش داخلی برای مرتب سازی آرایه ها ارائه می شود. در حالی که نتیجه نهایی یکسان است، موتورهای جاوا اسکریپت مختلف این روش را با استفاده از الگوریتمهای مرتبسازی مختلف پیادهسازی میکنند:
- V8: مرتبسازی سریع یا مرتبسازی درج (برای آرایههای کوچکتر)
- فایرفاکس: ادغام مرتب سازی
- سافاری: مرتبسازی سریع، مرتبسازی ادغام یا مرتبسازی انتخابی (بسته به روی نوع آرایه)
پیاده سازی واقعاً برای کد فراخوانی مهم نیست، اما جالب است که ببینید این الگوریتم های مرتب سازی در عمل پس از یادگیری طولانی در مورد آنها در کلاس های مقدماتی CS استفاده می شوند.
این تابع مرتب سازی به عنوان یک روش نمونه اولیه موجود است روی را Array
کلاس:
Array.sort((compareFunc))
به روش واقعی جاوا اسکریپت، یک callback به این تابع ارسال می شود که برای بیان روش مقایسه دو عنصر با یکدیگر به الگوریتم مرتب سازی استفاده می شود. را compareFunc
باید دو پارامتر داشته باشد، a
و b
، و مانند این کار می کند:
- اگر
compareFunc
0 را برمی گرداند، سپس عناصر برابر در نظر گرفته می شوند - اگر
compareFunc
سپس 1 را برمی گرداندb
قبل مرتب شده استa
- اگر
compareFunc
سپس -1 را برمی گرداندa
قبل مرتب شده استb
تابع لزوماً نیازی به برگرداندن 1 یا -1 ندارد، فقط تا زمانی که اعداد بازگشتی 0، بالای 0 یا زیر 0 باشند. بنابراین یک تابع مقایسه کننده مانند (a, b) => a - b;
کاملا معتبر است
اگر compareFunc
داده نمی شود سپس عناصر به رشته تبدیل می شوند و سپس بر اساس حروف الفبا مرتب می شوند. این موضوع مرتب سازی رشته ها را بی اهمیت می کند. با این حال، در حالی که به نظر می رسد مرتب سازی اعداد باید مستقیم باشد، در واقع می تواند در اینجا کمی گیج کننده باشد:
> let nums = (3, 2, 6, 50, 10);
> nums.sort()
( 10, 2, 3, 50, 6 )
همانطور که می بینید، اعداد به ترتیبی که انتظار داشتید نیستند. این به این دلیل است که همانطور که قبلا ذکر شد، روش مرتبسازی پیشفرض تبدیل عناصر به رشته قبل از انجام مقایسه است. و به عنوان یک رشته، “50” قبل از “6” می آید، به همین دلیل است که 50 در آرایه آخر نیست. برای مرتب کردن صحیح این آرایه، به جای آن موارد زیر را امتحان کنید:
> let nums = (3, 2, 6, 50, 10);
> nums.sort((a, b) => a - b);
( 2, 3, 6, 10, 50 )
توجه داشته باشید: مهم است که به خاطر داشته باشید که این روش مرتب می شود درجا، به این معنی که آرایه اصلی در واقع مرتب شده است و هیچ کپی ساخته نمی شود. بنابراین، در حالی که .sort()
متد آرایه مرتب شده را برمی گرداند، در واقع نیازی نیست آن را به چیزی اختصاص دهید زیرا آرایه ای که نامیده می شود روی مرتب شده است.
اگر میخواهید ترتیب مرتبسازی را معکوس کنید، کافی است مقایسه را تغییر دهید a
و b
. بنابراین اگر بخواهیم اعداد به ترتیب نزولی باشند، به صورت زیر عمل می کنیم:
> let nums = (3, 2, 6, 50, 10);
> nums.sort((a, b) => b - a);
( 50, 10, 6, 3, 2 )
مرتب سازی آرایه اشیاء
استفاده از یک تابع مقایسه کننده مانند این، مرتب کردن اشیاء سفارشی در جاوا اسکریپت را بسیار آسان می کند. به عنوان مثال، فرض کنید لیست زیر از داده های کاربر را داریم:
let users = (
{name: 'Scotty', age: '18'},
{name: 'Tommy', age: '21'},
{name: 'Sally', age: '71'},
{name: 'Billy', age: '18'},
{name: 'Timmy', age: '21'}
);
این چیزی نیست که الگوریتم مرتب سازی فقط بتواند خودش را تفسیر و مرتب کند. ترتیب نیز بسیار بستگی دارد روی برنامه. اگر بخواهیم بر اساس سن و سپس نام؟ برای انجام این کار، می توانیم مقایسه ای ارائه کنیم که این دو را ترکیب می کند:
users.sort((a, b) => {
let keyA = a.age + a.name;
let keyB = b.age + b.name;
if (keyA < keyB) return -1;
if (keyA > keyB) return 1;
return 0;
});
این منجر به آرایه مرتب شده زیر می شود:
( { name: 'Billy', age: '18' },
{ name: 'Scotty', age: '18' },
{ name: 'Timmy', age: '21' },
{ name: 'Tommy', age: '21' },
{ name: 'Sally', age: '71' } )
توجه داشته باشید که اکنون همه کاربران بر اساس سن مرتب شده اند. و همانطور که در نظر گرفته شده است، آن دسته از کاربران با همان سن، مانند بیلی و اسکاتی، بر اساس نام مرتب می شوند.
نتیجه
در این مقاله کوتاه روش استفاده از داخلی را دیدیم .sort()
روشی برای مرتب سازی آسان آرایه ها در جاوا اسکریپت. این برای هر نوع داده ای از جمله رشته ها، اعداد یا حتی اشیا اعمال می شود. ترتیب مرتب سازی توسط compareFun
متد callback، چیزی است که به شما امکان می دهد ترتیب مرتب سازی را تعیین کنید یا اینکه کدام ویژگی شی ترتیب مرتب سازی را تعیین می کند.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-23 17:51:06