در این بخش از آموزش طراحی سایت به بحث بسیار مهم مرتب کردن آرایه ها در زبان برنامه نویسی جاوا اسکریپت می پردازیم.
مرتب کردن آرایه (Array Sort)
در زبان جاوا اسکریپت ما متدی به نام ()sort داریم که این متد یک آرایه را براساس حروف الفبا مرتب می کند. مثال زیر آرایه ای از اسامی میوه ها را براساس حروف الفبا مرتب می کند.
خروجی مثال بالا به شکل زیر است:
برعکس کردن آرایه (Array Reverse)
متد ()reverse در زبان جاوا اسکریپت عنصرهای یک آرایه را برعکس می کند. به عبارتی شما می توانید از این متد برای نزولی کردن ترتیب عناصر آرایه استفاده کنید. مثال زیر نحوه انجام این کار را نشان می دهد.
خروجی مثال بالا به شکل زیر است:
ترتیب عددی
به صورت پیش فرض، تابع ()sort مقادیر آرایه را به عنوان رشته مرتب می کند. این قابلیت برای رشته ها به خوبی کار می کند (به عنوان مثال Apple قبل از Banana می آید). بر این اساس اگر اعداد به عنوان رشته مرتب شده باشند، 25 از 100 بزرگتر است چون 2 بزرگتر از 1 می باشد. به همین دلیل، متد ()sort هنگام مرتب کردن اعداد، جواب های نادرست تولید خواهد کرد.
شما می توانید این مشکل را با یک تابع مقایسه حل کنید.
خروجی مثال بالا به شکل زیر است:
و همین روش را برای مرتب کردن آرایه به صورت نزولی نیز استفاده کنید:
تابع مقایسه
هدف تابع مقایسه، تعریف کردن یک ترتیب قرارگیری جایگزین می باشد. تابع مقایسه باید بسته به نوع ورودی یک مقدار منفی، صفر یا مثبت برگرداند. نحوه نوشتن این تابع به شکل زیر است:
function(a, b){return a - b}
وقتی تابع ()sort دو مقدار را مقایسه می کند، مقادیر را به تابع مقایسه می برد و طبق مقداری که برگشته است مقادیر را مرتب می کند (منفی، صفر، مثبت).
اگر پاسخ تابع مقایسه منفی باشد a قبل از b مرتب می شود.
اگر پاسخ تابع مقایسه مثبت باشد b قبل از a مرتب می شود.
اگر پاسخ تابع مقایسه 0 باشد ترتیب قرار گیری دو مقدار هیچ تغییری نمی کند.
مثال:
تابع مقایسه تمام مقادیر را در آرایه مقایسه می کند، هر بار دو مقدار (a, b).
وقتی 40 و 100 مقایسه می شوند، متد sort() تابع مقایسه را فرا می خواند.
تابع 40 - 100 (a - b) را محاسبه می کند، و از آنجا که پاسخ منفی است، تابع ()sort مقدار 40 را بعنوان مقدار کمتر از 100 مرتب می کند.
شما می توانید از کد زیر برای مرتب کردن مقادیر آرایه به صورت عددی و الفبایی استفاده کنید:
خروجی مثال بالا به شکل زیر است:
مرتب کردن یک آرایه بصورت تصادفی (Random)
برای مرتب کردن یک آرایه به صورت تصادفی از متد ()random استفاده می شود. مثال زیر نحوه انجام این کار را نشان می دهد:
خروجی مثال بالا به شکل زیر است:
متد Fisher Yates
مثال بالا ()array.sort صحیح نیست، چون چند عدد را به بقیه ترجیح می دهد. محبوب ترین و درست ترین متد، آمیختگی Fisher Yates می باشد، که برای اولین بار در سال 1938 معرفی شد. آمیختگی فیشر یتس یا بر زدن فیشر یتس الگوریتمی برای ایجاد جایگشت تصادفی از یک دنباله است. این کار همانند بر زدن ورق در بازی پاسور می باشد و بر زدن آرایه به این معناست که هر کدام از جایگشت های ممکن با احتمال مساوی بیایند.
در جاوا اسکریپت این متد می تواند مانند بخش زیر پیاده سازی شود:
خروجی مثال بالا به شکل زیر است:
پیدا کردن بزرگترین یا کوچکترین مقدار آرایه
در زبان جاوا اسکریپت تابعی برای پیدا کردن بزرگترین و کوچترین مقدار در یک آرایه تعبیه نشده است. اما بعد از اینکه آرایه را مرتب کردید، می توانید از index اولین خانه آرایه برای یافتن بزرگترین و کوچکترین مقدار آرایه استفاده کنید.
در مثال زیر آرایه points به صورت صعودی مرتب شده است. بنابراین اولین عنصر آرایه کوچکترین مقدار آرایه است.
خروجی مثال زیر به شکل زیر است. همانطور که می بینید مقدار 1 به عنوان کوچکترین مقدار آرایه نمایش داده شده است.
در مثال زیر آرایه points به صورت نزولی مرتب شده است. بنابراین اولین عنصر آرایه بزرگترین مقدار آرایه است.
خروجی مثال زیر به شکل زیر است. همانطور که می بینید مقدار 100 به عنوان بزرگترین مقدار آرایه نمایش داده شده است.
استفاده از ()Math.max.apply روی آرایه
برای پیدا کردن بزرگترین عدد در آرایه می توانید از ()Math.max.apply استفاده کنید:
خروجی مثال بالا به شکل زیر است:
Math.max.apply(null, [1, 2, 3]) با Math.max(1, 2, 3) برابر است.
استفاده از ()Math.min روی آرایه
می توانید از ()Math.min.apply برای پیدا کردن کوچکترین مقدار در آرایه استفاده کنید. مثال زیر نحوه انجام این کار را نشان می دهد:
خروجی مثال زیر به شکل زیر است:
Math.min.apply(null, [1, 2, 3]) برابر با Math.min(1, 2, 3) می باشد.
متدهای My Min / Max JavaScript
سریع ترین راه حل برای پیدا کردن بزرگترین و کوچکترین مقدار آرایه، استفاده از متد دست ساز می باشد. این تابع درون آرایه پیمایش می کند و هر مقدار را با بزرگترین مقدار یافت شده مقایسه می کند:
خروجی مثال بالا به شکل زیر است:
مثال زیر آرایه را پیمایش می کند و هر مقدار را با کوچکترین مقدار یافت شده مقایسه می کند:
خروجی مثال بالا به شکل زیر است:
مرتب کردن آرایه های اشیا
آرایه های جاوا اسکریپت اغلب شامل اشیا می شوند:
حتی اگر اشیا، property هایی با نوع داده های مختلف داشته باشند، متد ()sort را می توان برای مرتب کردن آرایه استفاده کرد.
راه حل، نوشتن یک تابع مقایسه برای مقایسه کردن مقادیر property ها است:
خروجی مثال بالا به شکل زیر است:
مقایسه ی مشخصه های رشته (string properties) کمی پیچیده تر می باشد:
خروجی مثال بالا به شکل زیر است: