Сортировка временных отрезков в виде строки начала и окончания на Javascript или Typescript

TypeScript

Задача - сортировать массив объектов allSlots по дате начала и окончания. startTime и endTime - строки. Язык - Javascript или Typescript.
Исходный массив выглядит следующим образом.

const allSlots = 
[
  { startTime: '12:00', endTime: '15:00' },
  { startTime: '16:00', endTime: '18:00' },
  { startTime: '12:00', endTime: '14:00' },
  { startTime: '16:00', endTime: '18:01' },
  { startTime: '10:00', endTime: '14:00' }
]

Суть решения

В Javascript / Typescript функция сравнения пишется в таком виде
sort( (a, b) => { compareFn })

Функция compareFn должна вернуть положительное число, если a > b, отрицательное , если a < b, а ноль в случае равенства.

Сначала сортируем по времени - по часам и по минутам. Аналогично задачам по математике и физике начальной школы, преобразуем время к единой системе счисления, а именно - к минутам.

Для этого напишем небольшой метод, который распарсит строку на часы и минуты и приведет к минутам.

 const parseTime = (time: string): number => {
    const [hours, minutes] = time.split(':').map(Number)
    return hours * 60 + minutes
  }

 

Дальше сравним количество минут для startTime

  const mins1 = parseTime(a.startTime)
  const mins2 = parseTime(b.startTime)
  if (mins1 > mins2) return 1
  if (mins1 < mins2) return -1

Если startTime у a и b равный, то надо сравнить время окончания

  const ends1 = parseTime(a.endTime)
  const ends2 = parseTime(b.endTime)
  if (ends1 > ends2) return 1
  if (ends1 < ends2) return -1

А если получилось, что a === b, то тогда возвращаем 0

Полный код метода ниже

// сортировка массива временных отрезков в виде строк
const sortedSlots = allSlots.sort((a, b) => {
  const parseTime = (time: string): number => {
    const [hours, minutes] = time.split(':').map(Number)
    return hours * 60 + minutes
  }

  const mins1 = parseTime(a.startTime)
  const mins2 = parseTime(b.startTime)
  if (mins1 > mins2) return 1
  if (mins1 < mins2) return -1

  const ends1 = parseTime(a.endTime)
  const ends2 = parseTime(b.endTime)
  if (ends1 > ends2) return 1
  if (ends1 < ends2) return -1
  return 0
})

console.log(sortedSlots)

Комментариев нет »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment






MarkiMarta.ru. Записки отца-программиста" с 2009 г.
Категория информационной продукции 18+
Яндекс.Метрика