如何按日期范围过滤日期数组?

时间:2018-06-01 00:54:29

标签: javascript ecmascript-6 functional-programming

我有一个对象数组。每个对象都包含一个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/differenceInDays

2 个答案:

答案 0 :(得分:0)

在你的阵列之后,它应该是相当直接的。迭代并连续推入数组。遇到非连接时,将当前数组推入数组并从新数组开始。如果您要推送的阵列长度为1,只需将项目推入内部即可。将很快提供示例代码

<强>更新 沿着这些方向的东西,但仍然必须为最后一个值做一些事情,因为没有i + 1.下面的代码不起作用: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);
  }
      

答案 1 :(得分:0)

&#13;
&#13;
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))
&#13;
&#13;
&#13;