2017-02-14 14 views
0

Ich arbeite in Ionic 2 und ich versuche, eine for-Schleife zu machen, um bestimmte Daten zu zeigen. Aber es verhält sich sehr seltsam.Javascript (Typescript): for Schleife funktioniert nicht richtig

Im Moment habe ich eine Reihe von „Restzeit“ mit moment.js

var dur = moment.duration(moment(date).diff(moment())); 
let yearsRemain = dur.years(); 
let monthsRemain = dur.months(); 
let daysRemain = dur.days(); 
let hoursRemain = dur.hours(); 
let minutesRemain = dur.minutes(); 
let secondsRemain = dur.seconds(); 

var dateArray = [ 
    yearsRemain, 
    monthsRemain, 
    daysRemain, 
    hoursRemain, 
    minutesRemain, 
    secondsRemain 
] 

Wenn ich die Ausgabe waren die dateArray wie this.timeString = dateArray.join(","); und zeigen timeString in meinem html, kann ich folgende Werte sehen:

0, 0, 0,-17,-46, -3 //17 hours ago 
0, 0, 0, 10, 7, 47 //in 10 hours 7 minutes 
0, 0, 2, 1, 9, 35 //in 2 days and 1 hour 

Jetzt iteriere ich durch das Array und ich versuche, die zwei größten Werte zu erhalten. Ich versuche, eine Zeichenfolge wie in den obigen Kommentaren zu zeigen. Wenn es in der Vergangenheit ist, möchte ich nur den größten Wert anzeigen.

for(var i = 0; i < dateArray.length; i++) { 
    if(dateArray[i] > 0){ 
    //If the event is in the future 
    this.state = "future"; 
    this.timePrimary = dateArray[i]; 
    this.timePrimaryType = this.typeOfTime(i, dateArray[i]); 
    this.timeSecondary = dateArray[i+1] !== 0 ? dateArray[i+1] : dateArray[i+2]; 
    this.timeSecondaryType = dateArray[i+1] !== 0 ? this.typeOfTime(i+1, dateArray[i+1]) : this.typeOfTime(i+2, dateArray[i+2]); 
    break; 
    } else if(dateArray[i] < 0) { 
    //If the event is in the past 
    this.state = "past"; 
    this.timePrimary = dateArray[i] * (-1); 
    this.timePrimaryType = this.typeOfTime(i, (dateArray[i] * (-1))) + " ago"; 
    break; 
    } else { 
    i++ 
    } 
} 

Diese Schleife geht durch jedes Element-Array und sollte das erste Array Artikel abzufangen, die kein 0 ist. Wenn es größer als 0 ist, ist das Ereignis in der Zukunft und ich möchte diese Nummer und die nächste erfassen (wenn die nächste Null ist, finde die nächste, werde ich diesen Teil bald aktualisieren).

Hier ist das Problem

Aus irgendeinem Grund ist es das hours Teil des Arrays Skipping, wenn Stunden die größte Zahl ist. Nehmen Sie das zweite Beispiel von oben: 0, 0, 0, 10, 7, 47. Alles, was ich sehe, ist 7 minutes and 47 seconds, wenn es 10 hours and 7 minutes lesen sollte.

Irgendwelche Ideen, warum das passiert?

Gerade falls Sie wie zu fragen, fühlen, hier ist die typeOfType Funktion:

typeOfTime(type, num) { 
var display; 
var plur = num === 1 ? "" : "s"; 
switch(type) { 
    case 0: 
    display = "Year" + plur; 
    break; 
    case 1: 
    display = "Month" + plur; 
    break; 
    case 2: 
    display = "Day" + plur; 
    break; 
    case 3: 
    display = "Hour" + plur; 
    break; 
    case 4: 
    display = "Minute" + plur; 
    break; 
    case 5: 
    display = "Second" + plur; 
    break; 
} 
return display; 

}

+0

Warum erhöhen Sie "i" am Ende der Schleife? –

+0

@torazaburo Die 'else' Anweisung sagt im Grunde:' Wenn der Wert dieses Array-Elements gleich 0 ist, sehen Sie sich das nächste Array-Element an ' – ntgCleaner

+0

@torazaburo, Ihr Kommentar war tot. Ich hatte den größten Hirnfurz aller Zeiten. Kein Grund, eine Schleife innerhalb einer for-Schleife zu erhöhen ... Danke! – ntgCleaner

Antwort

1

Dies ist wegen der else Anweisung in Ihrem Code Erhöhung des Zählers i und das verursacht die Schleife Überspringt das nächste Element im Array, wenn es auf 0 trifft. Deshalb wird 10 nach 0 übersprungen. Entfernen Sie diesen Teil und es sollte funktionieren.

for(var i = 0; i < dateArray.length; i++) { 
    if(dateArray[i] > 0){ 
    //If the event is in the future 
    this.state = "future"; 
    this.timePrimary = dateArray[i]; 
    this.timePrimaryType = this.typeOfTime(i, dateArray[i]); 
    this.timeSecondary = dateArray[i+1] !== 0 ? dateArray[i+1] : dateArray[i+2]; 
    this.timeSecondaryType = dateArray[i+1] !== 0 ? this.typeOfTime(i+1, dateArray[i+1]) : this.typeOfTime(i+2, dateArray[i+2]); 
    break; 
    } else if(dateArray[i] < 0) { 
    //If the event is in the past 
    this.state = "past"; 
    this.timePrimary = dateArray[i] * (-1); 
    this.timePrimaryType = this.typeOfTime(i, (dateArray[i] * (-1))) + " ago"; 
    break; 
    } else { 
    //do nothing... let the loop to go on. 
    } 
} 
+0

Wow. das ist ein Facepalm genau dort ... Danke, dass du mir geholfen hast, wieder eine grundlegende Schleife zu verstehen! Die Antwort wird in 7 Minuten angenommen – ntgCleaner

Verwandte Themen