2017-01-21 15 views
1

Ich habe ein Array von Objekten wie so, wobei action immer entweder "Start" oder "Stop" ist, und time ist ein UNIX-Millisekunden-Zeitstempel (hier vereinfacht).Wie berechnet man die Gesamtzeit zwischen einer Liste von Einträgen?

[ 
    { 
    action: "start", 
    time: 100, 
    }, 
    { 
    action: "stop", 
    time: 150 
    }, 
    { 
    action: "start", 
    time: 250 
    }, 
    { 
    action: "stop", 
    time: 350 
    } 
] 

Ich muss herausfinden, die Gesamtmenge der verstrichenen Zeit zwischen jedem "Start" und "Stop". In diesem Fall wäre die richtige Antwort 150, weil

(150 - 100) + (350 - 250) = 150 

Es ist möglich, für das Array in einer „Start“ Eingabe zu beenden, wobei in diesem Fall würde der Unterschied, dass zwischen time und Date.now() sein.

Es wurde jedoch sichergestellt, dass das Array nach der Zeit sortiert ist, und "Start" und "Stop" -Einträge werden notwendigerweise ordnungsgemäß wechseln.

Wie kann ich darüber gehen?

Antwort

5

Sie könnten das Element überprüfen, wenn Start, dann subtrahieren Sie den Wert, andernfalls fügen Sie den Wert hinzu.

Für den Anfangswert von Array#reduce können Sie das letzte Element überprüfen und die tatsächliche epoc-Zeit als Startwert verwenden, andernfalls 0.

var data = [{ action: "start", time: 100 }, { action: "stop", time: 150 }, { action: "start", time: 250 }, { action: "stop", time: 350 }, { action: "start", time: 400 }], 
 
    end = 450, // should be Date.now(), 
 
    sum = data.reduce(function (r, a) { 
 
     return r + (a.action === 'start' ? -a.time : a.time); 
 
    }, data[data.length - 1].action === 'start' ? end : 0); 
 

 
console.log(sum);

1

Eigentlich ist es nicht kompliziert, wie Sie denken. Sie können im Grunde für jede Gruppe eine Addition anwenden (in Ihrem Fall starten und stoppen), danach totalStart von totalStop subtrahieren. Für den Fall "zusätzlicher Start", den Sie erwähnten, können Sie eine zusätzliche Bedingung hinzufügen.

var data = [{action: "start",time: 100,}, {action: "stop",time: 150}, {action: "start",time: 250}, {action: "stop",time: 350}, {action: "start",time: 375}, ]; 
 
totalStart = 0; 
 
totalStop = 0; 
 
isComplete = true; 
 

 
data.forEach(function(el) { 
 
    if (el.action == "start") { 
 
     isComplete = false; 
 
     totalStart += el.time; 
 
    } else if (el.action == "stop") { 
 
     isComplete = true; 
 
     totalStop += el.time; 
 
    } 
 
}); 
 

 
if (!isComplete) { 
 
    totalStop += 400; // Date().now() in your case 
 
} 
 

 
alert(totalStop - totalStart);

Auch gibt es viele Alternativen, das zu tun.

  1. Sie können die integrierte Funktion "Reduzieren" verwenden.
  2. Sie können über ein Array als zwei Elemente gleichzeitig iterieren. for (i = 0; i < datasize; i = i + 2) erster
0

Prüfen, ob das Array mit einem Starteintrittsenden und den Unterschied zwischen time und new Date().now()
In diesem Fall berechnen entfernen, die letzter Eintrag. Verwenden Sie danach den Reduzierungscode aus der vorherigen Antwort.

0

Ich bin nicht gut mit JavaScript auskennen, damit ich weiß nicht über die Berechnung

Unterschied zwischen dieser Zeit und neuem Datum würde(). Now().

<html> 
 
\t <head> 
 
\t \t <script language="JavaScript"> 
 
\t \t \t function getTimeDifference() 
 
\t \t \t { 
 
\t \t \t \t var timeArray = [ 
 
\t \t \t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t \t  action: "start", 
 
\t \t \t \t \t \t \t \t  time: 100, 
 
\t \t \t \t \t \t \t \t }, 
 
\t \t \t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t \t  action: "stop", 
 
\t \t \t \t \t \t \t \t  time: 150 
 
\t \t \t \t \t \t \t \t }, 
 
\t \t \t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t \t  action: "start", 
 
\t \t \t \t \t \t \t \t  time: 250 
 
\t \t \t \t \t \t \t \t }, 
 
\t \t \t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t \t  action: "stop", 
 
\t \t \t \t \t \t \t \t  time: 350 
 
\t \t \t \t \t \t \t \t }, 
 
\t \t \t \t \t \t \t \t { 
 
\t \t \t \t \t \t \t \t  action: "start", 
 
\t \t \t \t \t \t \t \t  time: 100, 
 
\t \t \t \t \t \t \t \t } 
 
\t \t \t \t \t \t \t \t ] 
 
\t \t \t \t var size = timeArray.length; 
 
\t \t \t \t var timeDiff = 0; 
 
\t \t \t \t if(timeArray[size-1].action == 'start') 
 
\t \t \t \t { 
 
\t \t \t \t \t // \t timeDiff = this.time - new Date().now(); 
 
\t \t \t \t } 
 
\t \t \t \t else 
 
\t \t \t \t { 
 
\t \t \t \t \t var startTime = 0; 
 
\t \t \t \t \t var endTime = 0; \t \t \t \t 
 
\t \t \t \t \t for(var i=0; i<size; i++) 
 
\t \t \t \t \t { \t \t \t \t \t \t \t \t 
 
\t \t \t \t \t \t if(timeArray[i].action == 'start') 
 
\t \t \t \t \t \t \t startTime = startTime + timeArray[i].time; 
 
\t \t \t \t \t \t else if(timeArray[i].action == 'stop') 
 
\t \t \t \t \t \t \t endTime = endTime + timeArray[i].time; \t \t \t \t \t 
 
\t \t \t \t \t } 
 
\t \t \t \t \t timeDiff = endTime - startTime; 
 
\t \t \t \t } 
 
\t \t \t \t alert(timeDiff); 
 
\t \t \t } 
 
\t \t </script> 
 
\t </head> 
 
\t <body> 
 
\t \t <input type="button" onclick="getTimeDifference()"/> 
 
\t </body> 
 
</html>

Wie Sie in den Zustand des Arrays mit Wirkung als Start enden sehen kann ich nicht die Rechnung gemacht haben, weil ich nicht sicher über das Verfahren.

Verwandte Themen