Вы должны быть осторожны с этим типом обработки, чтобы точно определить все бизнес-правила. Если временной компонент не должен учитываться, то его следует удалить, иначе при сравнении, скажем, с 2020-01-01T00: 00: 00 до 2020-01-02T012: 00: 00 вы получите разницу, превышающую 1 день, но не хочу, чтобы это воспринималось как начало нового диапазона.
По этой причине лог "1012 * разницы в днях" должен быть в отдельной функции, что также облегчает изменение библиотек дат, если Вы используете один. Разница в днях также подписана, поэтому убедитесь, что они переданы в правильном порядке.
В остальном, следующее почти то же самое, что и ответ Евгения, но я думаю, что оно немного более эффективно, поскольку создает только две даты каждая итерация вместо четырех.
let dateArray = [
"2020-01-22T00:00:00.000Z",
"2020-01-23T00:00:00.000Z",
"2020-01-28T00:00:00.000Z",
"2020-01-29T00:00:00.000Z",
"2020-01-30T00:00:00.000Z",
"2020-01-31T00:00:00.000Z",
"2020-02-01T00:00:00.000Z",
"2020-02-02T00:00:00.000Z",
"2020-02-03T00:00:00.000Z",
"2020-02-04T00:00:00.000Z",
"2020-02-05T00:00:00.000Z",
"2020-02-06T00:00:00.000Z",
"2020-02-07T00:00:00.000Z",
"2020-02-16T00:00:00.000Z",
"2020-02-17T00:00:00.000Z",
"2020-02-18T00:00:00.000Z",
"2020-02-19T00:00:00.000Z",
"2020-02-20T00:00:00.000Z"
];
// Simple difference in days function
function daysDiff(d0, d1) {
return Math.round((d1 - d0) / 8.64e7);
}
let ranges = dateArray.reduce((acc, curr, i, arr) => {
// If first date, initialise first object
if (!acc.length) {
acc.push({start: curr, end: curr});
} else {
let d0 = new Date(curr);
let d1 = new Date(arr[i-1]);
// If difference greater than 1 day, end previous range
// and start a new range
if (daysDiff(d1, d0) > 1) {
acc[acc.length - 1].end = arr[i-1];
acc.push({start: curr, end: curr});
}
}
return acc;
}, []);
console.log(ranges);