我正在开发一个日历,该日历可按带休息时间的时间段设置可用性。
我有两个输入数据
基本开始和结束时间。示例:
[{startTime: '07:00', endTime '21:00'}]
休息时间。示例:
[{startTime: '08:00', endTime:'08:30'},
{startTime: '10:00', endTime:'10:30'},
{startTime: '12:00', endTime:'13:00'},
{startTime: '15:00', endTime:'15:30'},
{startTime: '18:00', endTime:'19:00'}]
我需要根据基本开始和结束时间以及休息时间细分时间段。
给出上面输入数据的例子,我想得到。
[{startTime: '07:00', endTime: '07:59'},
{startTime: '08:31', endTime: '09:59'},
{startTime: '10:31', endTime: '11:59'},
{startTime: '13:01', endTime: '14:59'},
{startTime: '15:31', endTime: '17:59'},
{startTime: '19:01', endTime: '21:00'}]
答案 0 :(得分:1)
reduce 函数有助于管理数据转换。我使用了一个单独的函数来加/减时间
function getTimeFrom(time, diff) {
time = time.split(":");
let h = +time[0], m = +time[1]
if (time[1] == "00" && diff < 0) {
m = 60 + diff;
h -= 1;
} else m += diff;
return ("0" + h).slice(-2) + ":" + ("0" + m).slice(-2)
}
let worktime = [{startTime: '07:00', endTime: '21:00' }], breaktime = [{startTime: '08:00', endTime:'08:30'},
{startTime: '10:00', endTime:'10:30'},
{startTime: '12:00', endTime:'13:00'},
{startTime: '15:00', endTime:'15:30'},
{startTime: '18:00', endTime:'19:00'}]
let workdetail = breaktime.reduce((b, a, i) => {
if (i === 0) b[0].finalEndTime = b[0].endTime // save the value
b[i].endTime = getTimeFrom(a.startTime, -1)
a.startTime = getTimeFrom(a.endTime, 1)
if (i === breaktime.length - 1) {
a.endTime = b[0].finalEndTime; // our final end time for the day
delete b[0].finalEndTime // remove it
}
b.push(a);
return b;
}, worktime)
console.log(workdetail)