Javascript(Typescript):for循环不能正常工作

时间:2017-02-14 15:58:47

标签: javascript arrays typescript

我在Ionic 2工作,我正在尝试制作一个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
]

如果我要输出dateArray this.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;

}

1 个答案:

答案 0 :(得分:1)

这是因为您的代码中的else语句正在递增计数器i,这导致循环在到达0时跳过数组中的下一个项目。 这就是10之后跳过0的原因。 删除该部分,它应该工作。

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