Сравните дату и время, возвращенные из API, используя только JavaScript и реагируйте

#javascript #reactjs #date #compare #comparison

Вопрос:

У меня есть API, который возвращает мне данные о дате и времени примерно так: «2021-09-29T08:00:00». Я хочу отфильтровать эти даты и вернуть все даты до сегодняшнего дня. Я протестировал такую функцию:

   const currentDate = new Date();
  const results = licitacoes.map((item) => {
    const dateTime = new Date(item.licitacoesDate);
    if (currentDate < dateTime) {
      console.log("there are dateTime bigger than currentDate");
    } else {
      console.log("currentDate is bigger than DateTime");
    }
  }); 

Это прекрасно работает в моем коде. Но что я действительно хочу, так это отобразить все даты, которые больше текущей даты, когда пользователь выбирает опцию ввода.
Поэтому я попробовал этот код здесь:

  const currentDate = new Date();
 licitacoes.map((item) => {
       const dateTime = new Date(item.licitacoesDate);
      console.log(currentDate < dateTime)
    }); 

Который возвращает мне ложь и выдает ошибку, поэтому я тоже попробовал это:

 const currentDate = new Date();
licitacoes
      .filter((bigN) => new Date(bigN.licitacoesDate) < currentDate)
      .map((newNumber) => console.log(newNumber.cityName)); 

Что не сработает, если я протестирую bigN.licitacoes.дата > Текущая дата
А также возвращает мне гигантскую ошибку, но отображает названия городов, которые все еще доступны.
PS: Этот код будет отображаться внутри инструкции if кнопки выбора.

Licitacoes будет файлом json, подобным этому: licitacoes = [ { «идентификатор»: «1» назвАние города: «Лондон» «Дата выдачи licitacoes»: «2021-04-05T08:00:00″ Дата доставки:»2021-05-12T08:00:00» Источник: «www.google.com» Законное содержание: «лорем ипсум» } ]

Комментарии:

1. вы можете сделать dateTime - currentTime это и зарегистрировать, если оно больше 0

2. Определите «не работает». Что такое «гигантская ошибка»? Пожалуйста, предоставьте примеры данных для licitacoes , чтобы фрагменты кода отображали проблему.

3. Извините, я собираюсь обновить вопрос данными licitacoes. Консоль Mozila показывала мне множество различных ошибок, но когда я попробовал в Chrome, она показала только одну, ошибка была: «Ошибка типа не обнаружена: Не удается прочитать свойства неопределенного (чтение ‘id’)».

Ответ №1:

Проблема, я думаю, в следующем: у вас нет данных в ваших результатах? Это связано с тем, что вы не вернули значение из функции map, поэтому все, что вам нужно, — это оператор return.

Если вы хотите собирать только time с licitacoes , вы можете сделать это:

 licitacoes = [ { "id": "1", cityName: "London", "licitacoesDate": "2021-04-05T08:00:00", deliveryDate:"2021-05-12T08:00:00", sourceUrl: "www.google.com",licitacoesContent: "lorem ipsum" } ]


const currentDate = new Date();
const dates = licitacoes.map((item) => {
    const dateTime = new Date(item?.licitacoesDate);
        if (currentDate > dateTime) {
            return item.licitacoesDate
        }

    });
console.log(dates) 

лучший способ-сначала отфильтровать, а затем вернуть значение, как вы это сделали:

 licitacoes = [ { "id": "1", cityName: "London", "licitacoesDate": "2021-04-05T08:00:00", deliveryDate:"2021-05-12T08:00:00", sourceUrl: "www.google.com",licitacoesContent: "lorem ipsum" } ]


const currentDate = new Date();
const dates = licitacoes
  .filter((bigN) => new Date(bigN.licitacoesDate) < currentDate)
  .map((newNumber) => newNumber.licitacoesDate);
console.log(dates) 

Если вы хотите вернуть определенные данные, вы можете это сделать:

 licitacoes = [ { "id": "1", cityName: "London", "licitacoesDate": "2021-04-05T08:00:00", deliveryDate:"2021-05-12T08:00:00", sourceUrl: "www.google.com",licitacoesContent: "lorem ipsum" } ]


const currentDate = new Date();
const dates = licitacoes
  .filter((bigN) => new Date(bigN.licitacoesDate) < currentDate)
  .map((data) => {
      return {
         time: data.licitacoesDate,
         city: data.cityName,
         sourceUrl: data.sourceUrl
              }
});
console.log(dates) 

Или вы можете просто отфильтровать licitacoes без map , и он вернет массив со всеми отфильтрованными элементами.

Комментарии:

1. Большое вам спасибо за ваш ответ. Это сработало отлично! Не могу поверить, что все было так просто.

2. Я хочу собрать другие данные из api, которые также возвращаются, например, название города или содержимое. Вы не могли бы мне помочь?

3. Я обновил ответ.

Ответ №2:

  • Для большего, чем текущая дата: >
  • .map() возвращает массив, используйте forOf для отображения данных.
 const currentDate = new Date();
const filtered = licitacoes.filter((item) => new Date(item.licitacoesDate) > currentDate);
for(item of filtered){console.log(item.cityName)}
 

Комментарии:

1. Это, по сути, то, что ОП уже делает, но получает «гигантскую ошибку».