Я пытаюсь отсортировать объекты JSON, полученные от API, чтобы сначала отображалась самая последняя дата и время. Но то, как я сейчас это делаю, сортирует декабрь 2022 года как более поздний, чем январь 2023 года.
Вот с чем я работаю в настоящее время:
result = [
{
"date": "21/12/2022",
"time": "10:41:10",
},
{
"date": "20/12/2022",
"time": "12:42:21",
},
{
"date": "15/12/2022",
"time": "09:26:02",
},
{
"date": "14/12/2022",
"time": "10:20:54",
},
{
"date": "09/01/2023",
"time": "18:58:17",
},
{
"date": "09/01/2023",
"time": "18:57:34",
},
{
"date": "08/01/2023",
"time": "12:12:38",
}]
if (result.length > 1) {
result.sort((a, b) => {
const dateTime1 = new Date(a.date + a.time);
const dateTime2 = new Date(b.date + b.time);
return dateTime2 - dateTime1;
});
console.info(result);
};
Что дает мне:
{date: "21/12/2022", time: "10:41:10...}
{date: "20/12/2022", time: "12:42:21...}
{date: "15/12/2022", time: "09:26:02...}
{date: "14/12/2022", time: "10:20:54...}
{date: "09/01/2023", time: "18:58:17...}
{date: "09/01/2023", time: "18:57:34...}
{date: "08/01/2023", time: "12:12:38...}
Как я могу отсортировать это таким образом, чтобы он не думал, что 2022 год более поздний, чем 2023 год?
@JanPfeifer Это все равно не будет работать, поскольку JS не принимает «ДД/ММ/ГГГГ» в конструкторе.
Правда, это "ММ/ДД/ГГГ". Вам нужно разобрать его. Смотрите другой ответ.
@ Раджеш - это зависит. Разбор неподдерживаемых форматов зависит от реализации, поэтому возможен d/m/y. Суть в том, что не используйте встроенный парсер для неподдерживаемых форматов.
Проблема с вашим кодом - создание даты.
Вы можете использовать следующий фрагмент для создания даты, поскольку конструктор даты не принимает ДД/ММ/ГГГГ.
const createDate = (d, t) => {
const [date, month, year] = d.split('/')
const [hours, mins, secs] = t.split(':')
return new Date(year, month - 1, date, hours, mins, secs)
}
Кроме того, a.date + a.time неверно. Вы объединяете оба, но без пробела. Таким образом, будет вывод:
Дата: "21.12.2022" Время: «10:41:10» Вывод: "21.12.202210:41:10"
Ниже приведен рабочий пример
result = [{
"date": "21/12/2022",
"time": "10:41:10",
},
{
"date": "20/12/2022",
"time": "12:42:21",
},
{
"date": "15/12/2022",
"time": "09:26:02",
},
{
"date": "14/12/2022",
"time": "10:20:54",
},
{
"date": "09/01/2023",
"time": "18:58:17",
},
{
"date": "09/01/2023",
"time": "18:57:34",
},
{
"date": "08/01/2023",
"time": "12:12:38",
}
]
const createDate = (d, t) => {
const [date, month, year] = d.split('/')
const [hours, mins, secs] = t.split(':')
return new Date(year, month - 1, date, hours, mins, secs)
}
if (result.length > 1) {
result.sort((a, b) => {
const dateTime1 = createDate(a.date, a.time);
const dateTime2 = createDate(b.date, b.time);
return dateTime2 - dateTime1;
});
console.info(result);
};
Как правильно заметил @RobG
Это должна быть новая дата (год, месяц - 1, дата, часы, минуты, секунды), но для сортировки не имеет значения, если все месяцы равны +1.
Вы можете преобразовать ваши date и time в формат YYYY-MM-DD HH:MM:SS, а затем лексикографически отсортировать их.
const arr = [ { "date": "21/12/2022", "time": "10:41:10", }, { "date": "20/12/2022", "time": "12:42:21", }, { "date": "15/12/2022", "time": "09:26:02", }, { "date": "14/12/2022", "time": "10:20:54", }, { "date": "09/01/2023", "time": "18:58:17", }, { "date": "09/01/2023","time": "18:57:34", }, { "date": "08/01/2023", "time": "12:12:38", }],
sorted = arr.map(o => [o, o.date.split('/').reverse().join('-') + '_' + o.time])
.sort((a, b) => b[1].localeCompare(a[1]))
.map(([o]) => o);
console.info(sorted);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добавьте пробел в конструктор даты new Date(a.date + " " + a.time)