Задача - сортировать массив объектов 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)