Фильтр массива по диапазону дат

#javascript #arrays #filter

#javascript #массивы #Фильтр

Вопрос:

Привет, я хотел бы отфильтровать свои данные между диапазонами дат.

 {
    "websiteId": "4f8b36d00000000000000001",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 121,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000002",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 13,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000003",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 232,
    "missedChats": 9
},
{
    "websiteId": "4f8b36d00000000000000004",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 9,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000005",
    "date": "2019-04-03T00:00:00.000Z",
    "chats": 0,
    "missedChats": 5
},
{
    "websiteId": "4f8b36d00000000000000006",
    "date": "2019-04-03T00:00:00.000Z",
    "chats": 10,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000007",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 100,
    "missedChats": 1
},
{
    "websiteId": "4f8b36d00000000000000008",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 0,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000007",
    "date": "2019-04-02T00:00:00.000Z",
    "chats": 0,
    "missedChats": 1
},
{
    "websiteId": "4f8b36d00000000000000006",
    "date": "2019-04-02T00:00:00.000Z",
    "chats": 100,
    "missedChats": 50
}
 

Моя текущая реализация

 function getData(start, end) {
  if (start == null amp;amp; end == null) {
    fetch(url)
      .then((res) => res.json())
      .then((data) => {

        console.log(
          Object.values(
            data.reduce((acc, el) => {
              if (!(el.websiteId in acc)) {
                acc[el.websiteId] = el;
              } else {
                acc[el.websiteId].chats  = el.chats;
                acc[el.websiteId].missedChats  = el.missedChats;
              }
              return acc;
            }, {})
          )
        );
      });
  } else {
    var start = new Date('2019-04-01T00:00:00.000Z').getTime();
    var end = new Date('2019-04-05T00:00:00.000Z').getTime();

    result = data.filter((d) => {
      var time = new Date(d.date).getTime();
      return start < time amp;amp; time < end;
    });
    console.log(result);
  }
}
 

Ожидаемый результат

когда я запускаю getData(дата начала (2019-4-01), дата окончания (2019-4-02)) Я должен иметь возможность получать данные между этими диапазонами дат

 {
    "websiteId": "4f8b36d00000000000000007",
    "date": "2019-04-02T00:00:00.000Z",
    "chats": 100,
    "missedChats": 2
},
{
    "websiteId": "4f8b36d00000000000000006",
    "date": "2019-04-02T00:00:00.000Z",
    "chats": 110,
    "missedChats": 50
}
 

Я хотел бы получить данные между диапазоном дат при запуске функции getDate(StartDate, EndDate)

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

1. data.map(result => {}) не имеет никакого эффекта, поэтому не уверен, почему у вас это есть. Кроме того, data в if , кажется, происходит из вызова API, но в else , где data объявлено / назначено? Другими словами, ваши if и else выполняют совершенно разные и кажущиеся несвязанными вещи.

2. извините, забыл удалить мою карту. отредактировал мой вопрос.

3. Ваша функция имеет start и end в качестве параметров, но затем они повторно объявляются как const символы в else части. Параметры игнорируются.

4. извините, я не видел эту часть. отредактировал мой вопрос

5. Ваши start и end даты недопустимы: вам не хватает начала 0 в дневной части даты. Кроме того, end временная метка фактически предшествует start временной метке: возможно, опечатка?

Ответ №1:

Вы должны переместить условие if в .then блок:

 const data = [{
    "websiteId": "4f8b36d00000000000000001",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 121,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000002",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 13,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000003",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 232,
    "missedChats": 9
},
{
    "websiteId": "4f8b36d00000000000000004",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 9,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000005",
    "date": "2019-04-03T00:00:00.000Z",
    "chats": 0,
    "missedChats": 5
},
{
    "websiteId": "4f8b36d00000000000000006",
    "date": "2019-04-03T00:00:00.000Z",
    "chats": 10,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000007",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 100,
    "missedChats": 1
},
{
    "websiteId": "4f8b36d00000000000000008",
    "date": "2019-04-01T00:00:00.000Z",
    "chats": 0,
    "missedChats": 0
},
{
    "websiteId": "4f8b36d00000000000000007",
    "date": "2019-04-02T00:00:00.000Z",
    "chats": 0,
    "missedChats": 1
},
{
    "websiteId": "4f8b36d00000000000000006",
    "date": "2019-04-02T00:00:00.000Z",
    "chats": 100,
    "missedChats": 50
}];

function getData(start, end) {
  /*fetch(url)
    .then((res) => res.json())
    .then((data) => {*/
      const summedData =
        Object.values(
          data.reduce((acc, el) => {
            if (!(el.websiteId in acc)) {
              acc[el.websiteId] = el;
            } else {
              acc[el.websiteId].chats  = el.chats;
              acc[el.websiteId].missedChats  = el.missedChats;
            }
            return acc;
          }, {}));
      if (start amp;amp; end) {
        result = summedData.filter((d) => {
          const time = new Date(d.date).getTime();
          return start < time amp;amp; time < end;
        });
        console.log(result);
      } else {
        console.log(summedData);
      }
    /*});*/
}

const start = new Date('2019-04-01T00:00:00.000Z').getTime();
const end = new Date('2019-04-05T00:00:00.000Z').getTime();

getData(start, end);
getData(); 

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

1. @PinkyPromise Как вы можете видеть с помощью «Выполнить фрагмент кода», это работает. Это может означать, что выбранные и проанализированные данные отличаются от данных, которые вы опубликовали.

2. @PinkyPromise Я не могу помочь без дополнительной информации. Вы предоставили примерные данные, и с примерами данных это работает. Я не могу помочь с данными, которые вы не предоставили.

3. У вас есть два console.log оператора. Следовательно, у вас есть два вывода.

4. @PinkyPromise Вы пытались нажать кнопку «Выполнить фрагмент кода»? Если мой код работает, а ваш код не работает, между нашими кодами есть различия. Не показывая мне ваш код, я не могу помочь. Я знаю только код и данные в вашем вопросе, и я создал рабочее решение с этой информацией.

5. @PinkyPromise Важно понимать разницу между Stackoverflow и форумом. Цель состоит не в том, чтобы помочь одному пользователю, а в создании базы знаний, подобной wiki, чтобы помочь многим пользователям.

Ответ №2:

Учитывая ваши данные, ваш filter метод верен, вы должны преобразовать свои строки даты в a Date и сравнить с getTime .

 const data = [{
  "websiteId": "4f8b36d00000000000000001",
  "date": "2019-04-01T00:00:00.000Z",
  "chats": 121,
  "missedChats": 0
}, {
  "websiteId": "4f8b36d00000000000000002",
  "date": "2019-04-01T00:00:00.000Z",
  "chats": 13,
  "missedChats": 0
}, {
  "websiteId": "4f8b36d00000000000000003",
  "date": "2019-04-01T00:00:00.000Z",
  "chats": 232,
  "missedChats": 9
}, {
  "websiteId": "4f8b36d00000000000000004",
  "date": "2019-04-01T00:00:00.000Z",
  "chats": 9,
  "missedChats": 0
}, {
  "websiteId": "4f8b36d00000000000000005",
  "date": "2019-04-03T00:00:00.000Z",
  "chats": 0,
  "missedChats": 5
}, {
  "websiteId": "4f8b36d00000000000000006",
  "date": "2019-04-03T00:00:00.000Z",
  "chats": 10,
  "missedChats": 0
}, {
  "websiteId": "4f8b36d00000000000000007",
  "date": "2019-04-01T00:00:00.000Z",
  "chats": 100,
  "missedChats": 1
}, {
  "websiteId": "4f8b36d00000000000000008",
  "date": "2019-04-01T00:00:00.000Z",
  "chats": 0,
  "missedChats": 0
}, {
  "websiteId": "4f8b36d00000000000000007",
  "date": "2019-04-02T00:00:00.000Z",
  "chats": 0,
  "missedChats": 1
}, {
  "websiteId": "4f8b36d00000000000000006",
  "date": "2019-04-02T00:00:00.000Z",
  "chats": 100,
  "missedChats": 50
}];

function getData(start, end) {
  const startTime = new Date(start).getTime();
  const endTime = new Date(end).getTime();

  return data.filter(item => {
    const itemTime = new Date(item.date).getTime();

    return itemTime >= startTime amp;amp; itemTime <= endTime;
  })
}

console.log(getData('2019-04-01', '2019-04-02')) 

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

1. должен ли я поместить его поверх моего Object.values? не могу заставить это работать.

2. Я начинаю, не определено.

3. Где? мой фрагмент кода доступен для выполнения, и он выполняется :]

4. в моем текущем коде я не могу это реализовать. по вопросу выше.