I have an array of "shift times" and "absence times", and I'm trying to to subtract the absence time from the corresponding shift time via nested loop, to return the available shift times minus any absence time.
For example
- there's an absence that starts at 09:00 and finishes at 09:30 and
- the first shift time starts at 08:00 and finishes at 10:00.
The code subtracts the absence from the shift time and returns these two items:
- starts at 08:00 and finishes at 09:00
- starts at 09:30 and finishes at 10:00
I wonder if there is a simpler way to subtract the absences from the shifts times, but I've been trying to do so without success.
Also, my code does not returns the correct output. At this moment, the code retrurns:
[
{ start_time: '08:00', finish_time: '09:00' },
{ start_time: '09:30', finish_time: '10:00' },
{ start_time: '10:30', finish_time: '11:00' },
{ start_time: '12:30', finish_time: '16:00' },
{ start_time: '17:00', finish_time: '17:30' }
]
but the results should look like this:
[
{ start_time: '08:00', finish_time: '09:00' },
{ start_time: '09:30', finish_time: '10:00' },
{ start_time: '10:30', finish_time: '11:00' },
{ start_time: '12:30', finish_time: '16:00' },
{ start_time: '17:00', finish_time: '17:30' },
{ start_time: '19:00', finish_time: '20:00' }
]
const arranged_shifts = [{
'start_time' : '08:00',
'finish_time' : '10:00'
},
{
'start_time' : '10:30',
'finish_time' : '16:00'
},
{
'start_time' : '17:00',
'finish_time' : '18:00'
},
{
'start_time' : '19:00',
'finish_time' : '20:00'
}];
const absences = [{
'start_time' : '09:00',
'finish_time' : '09:30'
},
{
'start_time' : '11:00',
'finish_time' : '12:30'
},
{
'start_time' : '17:30',
'finish_time' : '18:00'
}
];
const available_times = [],
add_time = (start_time, finish_time) => {
available_times.push({
'start_time' : start_time,
'finish_time' : finish_time
});
};
const get_time_difference = (a_time, b_time) => {
return Date.parse('1970/01/01 ' + a_time) - Date.parse('1970/01/01 ' + b_time);
};
absences_loop : for (const absence of absences){
shift_loop : for (const arranged_shift of arranged_shifts){
const start_time_difference = get_time_difference(arranged_shift.start_time, absence.start_time),
finish_time_difference = get_time_difference(arranged_shift.finish_time, absence.finish_time);
if (start_time_difference === 0 && finish_time_difference > 0){
add_time(absence.finish_time, arranged_shift.finish_time);
}
else if (start_time_difference < 0 && finish_time_difference > 0){
add_time(arranged_shift.start_time, absence.start_time);
add_time(absence.finish_time, arranged_shift.finish_time)
}
else if (finish_time_difference === 0 && start_time_difference < 0){
add_time(arranged_shift.start_time, absence.start_time);
}
}
}
console.log(available_times);