Как отфильтровать массив дат по диапазону дат? - PullRequest
0 голосов
/ 01 июня 2018

У меня есть массив объектов.Каждый объект содержит атрибут Date.

Мне нужно вернуть массив объектов с атрибутами date.однако объекты, имеющие атрибуты даты, которые являются последовательными днями (с интервалом в 1 день), должны находиться в своем собственном массиве.

пример ввода:

const inputArray = [ObjectwDate, ObjectwDate, ObjectwDate, ObjectwDate, ObjectwDate, ObjectwDate, ObjectwDate, ObjectwDate];

пример ожидаемого вывода:

// example output
const finalArray = [ObjectwDate, ObjectwDate, [ObjectwDate, ObjectwDate, ObjectwDate], ObjectwDate, [ObjectwDate, ObjectwDate]];

Я действительно потерян, как заставить это работать во всех случаях.Пока что у меня есть что-то похожее на следующее:

 const rangeArray = [];
 const finalArray = [];

// sort input array for oldest date 
const format = inputArray.sort((a, b) => (
   new Date(a.date) - new Date(b.date)
));

format.sort((aDate, bDate) => {
  if (differenceInDays(bDate.date, aDate.date) === 1) {
     rangeArray.push(aDate, bDate);
  }

  finalArray .push(bDate);
});                

Мне кажется, что это не самый эффективный способ решения моей проблемы.Мне интересно, есть ли лучший способ перебрать массив и поместить все объекты с последовательными датами в их собственный массив.

Любая помощь будет оценена.

РЕДАКТИРОВАТЬ: Яиспользуя date-fns для расчета разницы в днях:

https://date -fns.org / v1.29.0 / docs / diffInInays

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

function randomDate(start, end) {
    return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime()));
}
let dates = [];

for (let i = 0; i < 20; i++)
{
  dates.push(randomDate(new Date(2018, 1, 5), new Date()));
}


dates = dates.sort((a, b) => a - b);



function GetDateDifference(date1, date2)
{
  var timeDiff = Math.abs(date2.getTime() - date1.getTime());
  var diffDays = Math.ceil(timeDiff / (1000 * 3600 * 24)); 
  return diffDays;
}

function CollectNearDates(arr)
{
  if(arr.length <= 1) return arr
  let outer = [];
  let inner = [arr[0]];
  let previousDate = inner[0];

  for(let i = 1; i < arr.length; i++)
  {
    let currentDate = dates[i];
    let difference = GetDateDifference(previousDate, currentDate);
    if(difference <= 1)
    {
      inner.push(previousDate);
      previousDate = currentDate;
      continue;
    }
    switch(inner.length)
    {
      case 0:
        break;
      case 1:
        outer.push(inner[0]);
        break;
      default:
        outer.push(inner);
    }
    previousDate = currentDate;
    inner = [currentDate]

  }
  if(inner.length === 1) outer.push(previousDate);
  else inner.push(previousDate);
  return outer;
}

console.log(CollectNearDates(dates))
0 голосов
/ 01 июня 2018

После того, как вы отсортируете массив, он должен быть довольно прямым оттуда.Перебирайте и вставляйте последовательные в массив.Когда вы встретите несопоставленное, вставьте текущий массив в массив и начните с нового.Если толкаемый вами массив имеет длину один, просто вставьте элемент внутрь.Пример кода будет предоставлен в ближайшее времяфункционал: D

function GroupConsecutiveDates(arrayOfDates)
{
  let outerArray = [];
  let innerArray = [];
  for(let i = 1; i < arrayOfDates.length; i++)
  {
    let currentDate = arrayOfDates[i];
    let nextDate = arrayOfDates[i + 1];
    let dateDifference = currentDate - nextDate;
    
    if(dateDifference > 1)
    {
      switch(innerArray.length)
      {
        case 0:
          break;
        case 1:
          outerArray.push(innerArray[0]);
        default:
          outerArray.push(innerArray);
      }
      innerArray = [currentDate];
      continue;
    }
    innerArray.push(currentDate);
  }
      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...