Есть массив интервалов, надо объединить перекрывающиеся, т.е:
[[0, 33],[66, 80]]
=>
[[0, 33],[66, 80]]
[[0, 33],[66, 80],[0, 66],[33, 100]]
=>
[[0,100]]
Накидал код:
const data = [
[0, 33],
[66, 80],
[0, 66],
[33, 100]
];
createDataForSlider = data =>
data.reduce((prevVal, time) => {
let isPrevValUpdated = false;
const timeStart = time[0];
const timeEnd = time[1];
/* eslint no-param-reassign: ["error", { "ignorePropertyModificationsFor": ["prevVal"] }] */
if (prevVal.length) {
for (let i = 0, ii = prevVal.length; i < ii; i += 1) {
let prevValCurrent = prevVal[i];
if (timeStart >= prevValCurrent[0] && timeEnd <= prevValCurrent[1]) {
isPrevValUpdated = true;
break;
}
if (
!isPrevValUpdated &&
timeStart >= prevValCurrent[0] &&
timeStart <= prevValCurrent[1]
) {
prevValCurrent[1] = timeEnd;
isPrevValUpdated = true;
break;
}
if (
!isPrevValUpdated &&
timeEnd >= prevValCurrent[0] &&
timeEnd <= prevValCurrent[1]
) {
prevValCurrent[0] = timeStart;
isPrevValUpdated = true;
break;
}
//console.log("prevVal-", prevVal);
}
}
if (!isPrevValUpdated) {
prevVal.push([timeStart, timeEnd]);
}
return prevVal;
}, []);
createDataForSlider(data);
На выходе имею
[[0, 100], [66, 80]]
. Это потому что сперва диапазон
[[0, 33]]
, потом
[[0, 33],[66, 80]]
, потом
[[0, 66], [66, 80]]
, потом
[[0, 100], [66, 80]]
как бы проверять и остальные диапазоны без зацикливания.