2017-12-04 3 views
0

Ich habe folgende Intervalle mit Start- und Endzeit:Finden überlappende zwischen den Intervallen in Javascript/Typoskript

{ status: 'A', start: 12:20, end: 12:35}, 
{ status: 'B', start: 12:21, end: 12:28}, 
{ status: 'C', start: 12:22, end: 12:30}, 
{ status: 'D', start: 12:30, end: 12:45}, 
{ status: 'E', start: 12:40, end: 12:48} 

Wie Sie sehen können, gibt es einige Überschneidungen, wie: 12:22 -->12:28 die A, B, and C Status enthält. oder D and E, die 12:40 -->12:45 Überlappung haben. Alle Daten werden basierend auf ihrer Startzeit sortiert. Wie kann ich ein Programm in Javascript schreiben, um die Überlappungen und ihre entsprechenden Status zu haben?

Grundsätzlich wäre die Ausgabe wie folgt vor:

[A, B, C] : {12:22 , 12:28} 
[D, E] : {12:40 , 12:45} 
... 

Aktuelle Code findet zwei Überschneidungen:

const schedule = [ 
 
     { status: 'A', start: '12:20', end: '12:35'}, 
 
     { status: 'B', start: '12:21', end: '12:28'}, 
 
     { status: 'C', start: '12:22', end: '12:30'}, 
 
     { status: 'D', start: '12:30', end: '12:45'}, 
 
     { status: 'E', start: '12:40', end: '12:48'} 
 
    ] 
 
    const intervali = {start: '', end:'', status:''}; 
 
    for (i = 0; i < schedule.length - 1; i++) { 
 
     interval_i = schedule[i]; 
 
     for (j = i + 1; j < schedule.length; j++) { 
 
     interval_j = schedule[j]; 
 
     if (interval_j.start < interval_i.end && interval_j.end > interval_i.start) { 
 
      intervali['start'] = interval_i.start > interval_j.start ? interval_i.start : interval_j.start; 
 
      intervali['end'] = interval_i.end < interval_j.end ? interval_i.end : interval_j.end; 
 
      intervali['status'] = interval_i.status + ' - ' + interval_j.status; 
 
      console.log(intervali) 
 
     } 
 
     } 
 
    }

+0

Haben Sie versucht, verschachtelte Schleifen verwenden? – VtoCorleone

+2

Sie haben sie, sie sind genau dort. – Mvarta

+0

@VtoCorleone Ja, aber es werden nicht alle überlappenden Intervalle zurückgegeben. – Eni

Antwort

0

Sie verschachtelte Schleifen Schleife zweimal über jedes Element verwenden können und führe einen Vergleich durch. Bitte beachten Sie die Kommentare unten.

const schedule = [ 
 
    { status: 'A', start: '12:20', end: '12:35'}, 
 
    { status: 'B', start: '12:21', end: '12:28'}, 
 
    { status: 'C', start: '12:22', end: '12:30'}, 
 
    { status: 'D', start: '12:30', end: '12:45'}, 
 
    { status: 'E', start: '12:40', end: '12:48'} 
 
] 
 

 
// convert a time string to integer of minutes 
 
const toMinutes = time => { 
 
    const [hour, minute] = time.split(':') 
 
    return (Number(hour) * 60) + Number(minute) 
 
} 
 

 
function findOverlappying(schedule) { 
 
    
 
    const l = schedule.length 
 
    const ret = {} 
 
    
 
    // loop over each item twice 
 
    for (let i = 0; i < l; i++) { 
 
    for (let j = 0; j < l; j++) { 
 

 
     const left = schedule[j] 
 
     const right = schedule[i] 
 
     
 
     // set the status to the return object 
 
     ret[left.status] = ret[left.status] || { 
 
     ...left, 
 
     overlap: [] 
 
     } 
 
     
 
     // don't process for the same key 
 
     if (i === j) { 
 
     continue 
 
     } 
 
     
 
     // get the start and stop times as minutes to compare 
 
     const leftStart = toMinutes(left.start) 
 
     const leftStop = toMinutes(left.end) 
 
     const rightStart = toMinutes(right.start) 
 
     const rightStop = toMinutes(right.end) 
 
     
 
     // compare the start and stop times for overlapping 
 
     if (
 
     (leftStart > rightStart && leftStart < rightStop) || 
 
     (leftStop > rightStart && leftStop < rightStop) 
 
    ) { 
 
     // add time to overlapping status identifier 
 
     ret[left.status].overlap.push(right.status) 
 
     } 
 
    } 
 
    } 
 
    return ret 
 
} 
 

 
console.log(
 
    findOverlappying(schedule) 
 
)
<script src="https://codepen.io/synthet1c/pen/KyQQmL.js"></script>

Verwandte Themen