我有一个对象数组。每个对象都包含一个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来计算天数差异:
答案 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)
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;