有一个区间数组,需要合并重叠,即:
[[0, 33], [66, 80]] => [[0, 33], [66, 80]]
[[0, 33], [66, 80], [0, 66], [33, 100]] => [0,100]
写了代码。我得到结果 [[0, 100], [66, 80]]。这是因为首先是范围 [[0, 33]],然后是 [[0, 33], [66, 80]] ,然后是 [[0, 66], [66, 80]] ,然后是 [[0, 100 ] , [66, 80]] 好像在不循环的情况下检查其他范围
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);