I have an array called entriesFinal
that contains arrays with a start time, end time, and duration.
I want to push these entries to an empty array called ganttData
, adding on a couple of extra fields.
Some of the entries in entriesFinal
overlap, and I don't want these in ganttData
.
Below is my current implementation which is functionally perfect, but the execution time is too long.
N.B. forEachAsync
is a custom method that is functionally equivalent to a regular forEach
, but works asynchronously.
let invalidEntries = []
await forEachAsync(entriesFinal, async entry1 => {
await forEachAsync(entriesFinal, async entry2 => {
if(entry1 != entry2){
let invalidStart = entry2.startTime.isBetween(entry1.startTime, entry1.endTime)
let invalidEnd= entry2.endTime.isBetween(entry1.startTime, entry1.endTime)
if(invalidStart || invalidEnd){
invalidEntries.push(entry2)
}
}
})
})
await forEachAsync(entriesFinal, async entry => {
if(!invalidEntries.includes(entry)){
ganttData.push({
name: channel.name,
label: label,
startTime: entry.startTime.format("DD/MM/YYYY HH:mm:ss"),
endTime: entry.endTime.format("DD/MM/YYYY HH:mm:ss"),
duration: entry.duration
})
}
})
Is there a more efficient way of excluding the overlapping entries? This whole sequence is inside a wider loop which runs ~1500 times, hence my need to minimize the execution time of this process.