برنامه نویسی

مرتب سازی آرایه پایه و پیشرفته

مرتب کردن یک آرایه با یک مقدار نسبتاً ساده است زیرا تابع مقایسه ای که به مرتب سازی آرایه ارسال می شود از این قانون پیروی می کند تا ترتیب مرتب سازی را بر اساس موارد زیر اعمال کند:

ارزش برگشتیترتیب مرتب سازی
منفیکمتر (مرتب کردن a قبل از z)
صفربرابر (حفظ نظم اصلی a و z)
مثبتبزرگتر (مرتب کردن z قبل از a)

با در نظر گرفتن این موضوع، بسته به نوع داده، رویکردهای متفاوتی وجود دارد.

رشته

شما می توانید استفاده کنید .sort() بدون پارامتر برای مرتب کردن رشته ها، اما توصیه می شود از localeCompare استفاده کنید زیرا می توان آن را طوری پیکربندی کرد که علائم نقطه گذاری (لهجه ها) را نادیده بگیرد، برمی گرداند. -1، 0، 1 اگر a < z، a == z، a > z.

const animals = [ 'cat', 'dog', 'wolf', 'lion', 'sheep', 'antelope']
animals.sort((a, z) => a.localeCompare(z))
console.log(animals) // [ 'antelope', 'cat', 'dog', 'lion', 'sheep', 'wolf' ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

عددی

تفریق روی فیلدهای عددی کار می کند، زیرا a - z می دهد -، 0، + اگر a < z، a == z، a > z.

let numbers = [ 0, 20, 2, 3, 30, 10, 1 ]
numbers.sort((a, z) => a - z)
console.log(numbers) //[ 0, 1, 2, 3, 10, 20, 30 ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تاریخ

تاریخ (با یا بدون زمان) با تفریق مقایسه می شود زیرا ریاضیات تاریخ از سال 1970 به میلی ثانیه تبدیل می شود.

const dates = ['Mar 18 2016', '09/24/2017', 'Jan 22 2022', '1998-05-21']
dates.sort((a, z) => new Date(a) - new Date(z))
console.log(dates) // [ '1998-05-21', 'Mar 18 2016', '09/24/2017', 'Jan 22 2022' ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

بولی

مقایسه بولی با تفریق، که تضمین شده است true و false به 1 و 0 (بنابراین تفریق تولید می کند -1 یا 0 یا 1).

const boolean = [true, false, true, false, true]
boolean.sort((a, z) => Boolean(a) - Boolean(z))
console.log(Boolean) //[ false, false, true, true, true ]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

جلب توجه با Boolean() سازنده، حتی اگر آنها از قبل Boolean باشند.

به صورت برعکس

مبادله مقادیر مقایسه

animals.sort((a, z) => z.localeCompare(a))
numbers.sort((a, z) => z - a)
dates.sort((a, z) => new Date(z) - new Date(a))
boolean.sort((a, z) => Boolean(z) - Boolean(a))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

یا مقایسه را نفی کنید

ترفند نفی را در نظر داشته باشید زیرا می تواند بعدا مفید باشد

animals. Sort((a, z) => -( a.localeCompare(z) ))
numbers.sort((a, z) => -( a - z ))
dates.sort((a, z) => -( new Date(a) - new Date(z) ))
boolean.sort((a, z) => -( Boolean(a) - Boolean(z) ))
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

ترفند نفی را در نظر داشته باشید زیرا می تواند بعداً برای مرتب سازی پیشرفته مفید باشد

برای مرتب‌سازی آرایه‌ای از اشیا، از تمام مثال‌های قبلی استفاده می‌کنیم، اما اگر نیاز به مرتب‌سازی با استفاده از چندین ویژگی داشته باشیم، به چند ترفند خاص نیاز داریم.

const records = [
  {
    id: '1',
    country: 'Colombia',
    value: 500,
    hasDetail: true,
    timestamp: '2023-04-27T02:23:39.000Z'
  },
  {
    id: '2',
    country: 'Spain',
    value: 1_000,
    hasDetail: true,
    timestamp: '2015-04-27T23:31:05.000Z'
  },
  {
    id: '3',
    country: 'Argentina',
    value: 1_000,
    hasDetail: false,
    timestamp: '2000-01-01T00:00:00.000Z'
  },
    {
    id: '5',
    country: 'Colombia',
    value: 2_000,
    hasDetail: true,
    timestamp: '2023-04-27T02:23:39.000Z'
  },
  {
    id: '6',
    country: 'Spain',
    value: 1_000,
    hasDetail: false,
    timestamp: '2018-04-27T23:31:05.000Z'
  },
  {
    id: '4',
    country: 'Argentina',
    value: 100,
    hasDetail: true,
    timestamp: '2020-01-01T23:15:00.000Z'
  }
]
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این داده های خام (بدون مرتب سازی) با استفاده از console. Table(records) نشان خواهد داد:

شناسهکشورارزشدارای جزئیاتمهر زمانی
‘1’“کلمبیا”500درست است، واقعی‘2023-04-27T02:23:39.000Z’
‘2’‘اسپانیا’1000درست است، واقعی‘2015-04-27T23:31:05.000Z’
‘3’“آرژانتین”1000نادرست‘2000-01-01T00:00:00.000Z’
‘5’“کلمبیا”2000درست است، واقعی‘2023-04-27T02:23:39.000Z’
‘6’‘اسپانیا’1000نادرست‘2018-04-27T23:31:05.000Z’
‘4’“آرژانتین”100درست است، واقعی’01-01-2020T23:15:00.000Z’

ابتدا باید با هر ویژگی یک شی مرتب سازی ایجاد کنیم.

records.sort((a, z) => {
  const sort = {
    id: a.id.localeCompare(z.id),
    country: a.country.localeCompare(z.country),
    value: a.value - z.value,
    hasDetail: Boolean(a.hasDetail) - Boolean(z.hasDetail),
    timestamp: new Date(a.timestamp) - new Date(z.timestamp)
  }
  ...
})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

سپس سفارش را با توجه به نیاز خود با استفاده از || اپراتور، با در نظر گرفتن این که اولویت را از چپ به راست دنبال می کند و برای ترتیب معکوس از آن استفاده می کند نفی ترفند در هر زمینه ای

records.sort((a, z) => {
  ...
  return sort.country || -sort.value || sort.timestamp
})
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

و نتیجه اطلاعات مرتب شده به صورت زیر خواهد بود:

شناسه🔼کشور🔽ارزشدارای جزئیات🔼مهر زمان
‘3’“آرژانتین”1000نادرست‘2000-01-01T00:00:00.000Z’
‘4’“آرژانتین”100درست است، واقعی’01-01-2020T23:15:00.000Z’
‘5’“کلمبیا”2000درست است، واقعی‘2023-04-27T02:23:39.000Z’
‘1’“کلمبیا”500درست است، واقعی‘2023-04-27T02:23:39.000Z’
‘2’‘اسپانیا’1000درست است، واقعی‘2015-04-27T23:31:05.000Z’
‘6’‘اسپانیا’1000نادرست‘2018-04-27T23:31:05.000Z’

توجه داشته باشید: .sort() آرایه را بی صدا می کند، .toSorted() همین کار را انجام دهید اما یک آرایه جدید با عناصر مرتب شده برمی گرداند.

این روش‌های مرتب‌سازی آرایه به‌عنوان قطعه‌ای در پسوند Arrow Functions Snippets برای VSCode موجود هستند.


این همه مردم!
کد نویسی مبارک
🖖

آبجو

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا