// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 07:00:00','endTime':'2022-07-20 19:50:00'},{startTime:'2022-07-20 06:00:00','endTime':'2022-07-20 07:10:00'}]// 三个互相交叉
// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 07:00:00','endTime':'2022-07-20 19:50:00'},{startTime:'2022-07-20 20:00:00','endTime':'2022-07-20 20:30:00'}]// 两个互相交叉 第三项不交叉
// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 19:00:00'},{startTime:'2022-07-20 19:00:00','endTime':'2022-07-20 20:10:00'}]
// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 07:00:00','endTime':'2022-07-20 19:50:00'}]
// timePairList = [{startTime:'2022-07-20 05:00:00','endTime':'2022-07-20 18:50:00'},{startTime:'2022-07-20 04:00:00','endTime':'2022-07-20 19:50:00'},{startTime:'2022-07-20 03:00:00','endTime':'2022-07-20 07:10:00'}]
export const compare = (first, second) => {
const left = [new Date(first.startTime), new Date(first.endTime)];
const right = [new Date(second.startTime), new Date(second.endTime)];
if (left[1] < right[0]) {
// 没有交集
return [first, second];
}
if (left[1] >= right[0]) {
// 有交集
if (left[1] < right[1]) {
return [
{
startTime: first.startTime,
endTime: second.endTime,
},
];
} else {
return [
{
startTime: first.startTime,
endTime: first.endTime,
},
];
}
}
};
export const compose = (arr) => {
arr = arr.sort((a,b)=>{
let startA = moment(a.startTime).valueOf()
let startB = moment(b.startTime).valueOf()
return startA-startB
})
let res = [];
let temp = [arr[0]];
let len = arr.length;
let i = 0;
if (len < 2) {
return arr;
}
while (i < len - 1) {
temp = compare(temp[temp.length - 1], arr[i + 1]);
if (temp.length === 2) {
// 无交集
res.push(temp[0]);
}
i += 1;
}
res.push(temp[temp.length - 1]);
return res;
};
const arr = [
{ startTime: "2022-07-20 05:00:00", endTime: "2022-07-20 05:50:00" },
{ startTime: "2022-07-20 06:00:00", endTime: "2022-07-20 06:10:00" },
{ startTime: "2022-07-20 07:00:00", endTime: "2022-07-20 07:50:00" },
{ startTime: "2022-07-20 08:10:00", endTime: "2022-07-20 19:50:00" },
];
console.log(compose(arr));
第二种方法:
const mergeTime = (arr: object[]) => { if (arr.length <= 0) { return; } else if (arr.length <= 1) { result = result.concat(arr); return; } const temp: object[] = []; for (let index = 0; index < arr.length - 1; index++) { const element1 = arr[index]; const element2 = arr[index + 1]; const startTimeDiff = moment(element1.endTime).diff( moment(element2.startTime), ); if (startTimeDiff >= 0) { const endTimeDiff = moment(element1.endTime).diff( moment(element2.endTime), ); if (endTimeDiff > 0) { temp.push({ startTime: element1.startTime, endTime: element1.endTime, }); } else { temp.push({ startTime: element1.startTime, endTime: element2.endTime, }); }
if (arr.length > 2) { const nextSource = temp.concat(arr.slice(2)); mergeTime(nextSource); } else { result = result.concat(temp); } break; } else { result.push(element1); if (arr.length > 1) { mergeTime(arr.slice(1)); } break; } } console.log(result, 'result'); };