2017-02-14 74 views
0

我在Ionic 2中工作,我試圖做一個for循環來顯示某些數據。但它表現得很奇怪。Javascript(Typescript):for循環無法正常工作

我公司目前擁有的「剩餘時間」的數組使用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 
] 

如果我要輸出dateArraythis.timeString = dateArray.join(",");和我的HTML,我可以看到下面的值顯示timeString

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 

現在,我遍歷數組,並試圖獲得兩個最大的值。我試圖在上面的註釋中顯示一個字符串。如果是過去,我想展示最大的價值。

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++ 
    } 
} 

此循環遍歷每個數組項並且應該捕獲不是0的第一個數組項。如果它大於0,這個事件將來會發生,我想要捕獲這個數字,然後下一個(如果下一個是零,找到下一個,我將盡快升級這個部分)。

這裏的問題

出於某種原因,它跳過陣列的hours一部分時,小時是最大數。拿上面的第二個例子:0, 0, 0, 10, 7, 47。我看到的是7 minutes and 47 seconds,當它應該是10 hours and 7 minutes

任何想法爲什麼會發生這種情況?

就在你感覺像是在問的情況下,這裏的typeOfType功能:

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

爲什麼你要在循環底部增加'i'? – 2017-02-14 16:01:21

+0

@torazaburo'else'聲明基本上是說'如果這個數組項的值等於0,看看下一個數組項' – ntgCleaner

+0

@torazaburo,你的評論已經死了。我有過最大的放屁。沒有理由增加for循環內的循環...謝謝! – ntgCleaner

回答

1

這是因爲在代碼中else說法是增加計數器i,並導致該循環當它遇到0時,跳過陣列中的下一個項目。 這就是爲什麼在0之後10被跳過的原因。 刪除該部分,它應該工作。

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

哇。這是一個facepalm ...謝謝你幫助我瞭解一個基本循環!答案將在7分鐘後被接受 – ntgCleaner