JavaScript, как сортировать дату по последнему первому

Я пытаюсь отсортировать объекты 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 год?

Добавьте пробел в конструктор даты new Date(a.date + " " + a.time)

Jan Pfeifer 10.01.2023 13:44

@JanPfeifer Это все равно не будет работать, поскольку JS не принимает «ДД/ММ/ГГГГ» в конструкторе.

Rajesh 10.01.2023 13:46

Правда, это "ММ/ДД/ГГГ". Вам нужно разобрать его. Смотрите другой ответ.

Jan Pfeifer 10.01.2023 13:50

@ Раджеш - это зависит. Разбор неподдерживаемых форматов зависит от реализации, поэтому возможен d/m/y. Суть в том, что не используйте встроенный парсер для неподдерживаемых форматов.

RobG 10.01.2023 14:07
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
Оптимизация React Context шаг за шагом в 4 примерах
Оптимизация React Context шаг за шагом в 4 примерах
При использовании компонентов React в сочетании с Context вы можете оптимизировать рендеринг, обернув ваш компонент React в React.memo сразу после...
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Интервьюер: Почему '[] instanceof Object' возвращает "true"?
Все мы знаем, что [] instanceof Array возвращает true, но почему [] instanceof Object тоже возвращает true?
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) и как оно работает с ReactJS
Абстрактное синтаксическое дерево (AST) - это древовидная структура данных, которая представляет структуру и иерархию исходного кода на языке...
0
4
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема с вашим кодом - создание даты.

Вы можете использовать следующий фрагмент для создания даты, поскольку конструктор даты не принимает ДД/ММ/ГГГГ.

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; }

Другие вопросы по теме