0

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.

Charlie
  • 530
  • 10
  • 26
  • did you compare the time with regular `for(;;)` loop? function calls have pretty big overhead depending on the browser optimizations – Slai Nov 21 '18 at 12:43
  • 2
    if you sort entries by startTime, you'll only need to compare an entry with the previous one, not with all others. – georg Nov 21 '18 at 12:44
  • @Slai are you talking about the isBetween() function? If so, I am using moment.js for the dates and isBetween() is a built-in function – Charlie Nov 21 '18 at 12:44
  • 1
    functions in general have more overhead than native JavaScript, but my guess is that the custom forEachAsync has even more overhead https://stackoverflow.com/questions/43821759/why-array-foreach-is-slower-than-for-loop-in-javascript – Slai Nov 21 '18 at 12:52

0 Answers0