Javascript(Typescript):for循环无法正常工作
我在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
]
如果我要输出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;
}
这是因为在代码中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.
}
}
哇。这是一个facepalm ...谢谢你帮助我了解一个基本循环!答案将在7分钟后被接受 – ntgCleaner
为什么你要在循环底部增加'i'? – 2017-02-14 16:01:21
@torazaburo'else'声明基本上是说'如果这个数组项的值等于0,看看下一个数组项' – ntgCleaner
@torazaburo,你的评论已经死了。我有过最大的放屁。没有理由增加for循环内的循环...谢谢! – ntgCleaner