繁体   English   中英

JS for 循环没有显示正确的结果

[英]JS for loop not showing correct result

问题:

恰好在 10:25:21 ,汽车速度为 6。

11分钟后即10点36分21秒,车速增加1,也增加7。

10:46:21后至12:00:00,每分钟,车速稳定增加1,8以后也是如此。

 <script> var date = new Date(); date.setHours(10); date.setMinutes(25); date.setSeconds(21); var speed; for (let i = 0; i < 95; i++) { if (i < 35) { speed = 6; } //increase speed by 1 after 10:36:21 else if (i < 45) { speed = 7; } // speed continously increase by 1 after 10:46:21 else { speed++; } date.setMinutes(25+i); document.write(date + ":" + speed + "m/s <br><br>"); } </script>

结果显示 6 到 10:59:21 而不是 10:36:21

当速度增加到7时,小时和分钟也增加了。

任何帮助表示赞赏。 如果我是这里的新手,我深表歉意。

for (let i =  0; i < 95; i++) {

您正在迭代i ,其中包含分钟数 - 25,因为您从 25 分钟开始。

if (i < 35) { 

将在第 35 个循环(包括)之前为真。

你可以减去你的起始值:

if (i < 10) { 
    speed = 6; 
} 
//increase speed by 1 after 10:36:21
else if (i < 20) 
{ speed = 7; 
} 

我认为您使用的数量有问题,此外,您还有另一个想法:

var date = new Date();
date.setHours(10);
date.setMinutes(25);
date.setSeconds(21);

var speed; 
var dateToShow;

function addMinutes(date, minutes) {
    return new Date(date.getTime() + minutes*60000);
}

for (let i =  1; i < 96; i++) { 
    if (i < 11) { 
        speed = 6; 
    } 
    //increase speed by 1 after 10:36:21
    else if (i < 22) 
    { speed = 7; 
    } 
    // speed continously increase by 1 after 10:46:21
    else
    { speed++; 
    } 
    
    dateToShow = addMinutes(date, i); 

    document.write(dateToShow + ":" + speed + "m/s <br></br>")

}

我认为这可以解决您的问题。

我添加了一个额外的功能来将分钟添加到新日期,这样你就不会遇到更多问题

至少可以说,代码中的逻辑很奇怪。

与其使用计数器手动计算每一分钟,不如简单地创建行程开始和结束的日期,并标记速度增加的两个地方:

 var startTime = new Date(); startTime.setHours(10); startTime.setMinutes(25); startTime.setSeconds(21); var endTime = new Date(); endTime.setHours(12); endTime.setMinutes(0); endTime.setSeconds(0); var time1 = new Date(); time1.setHours(10); time1.setMinutes(36); time1.setSeconds(21); var time2 = new Date(); time2.setHours(10); time2.setMinutes(46); time2.setSeconds(21); var thisTime = startTime; var speed = 0; while (thisTime < endTime) { if (thisTime < time1) { speed = 6; } else if (thisTime < time2) { speed = 7; } else { speed++; } document.write(thisTime + ":" + speed + "\\n<br>"); thisTime.setMinutes(thisTime.getMinutes() + 1); }

使用thisTime作为路由中的当前时间,我们只需为每次迭代更新 1 分钟。 这是一个从开始时间到结束时间运行的while循环,因此只要thisTime大于endTime它就会结束循环。

在开始编写任何代码之前,您需要先确定几件事:对象、事实、变量、状态和输出

对象

1 哪些对象提供了您需要在代码中使用的东西?

2 您需要在代码中创建哪些对象?

3 您需要在代码中操作哪些对象?

4 哪些对象与您的代码完全无关?

5 您将如何处理代码中使用的任何对象?

事实

什么是已知的、静态的、事实?

哪些值在代码执行过程中永远不会改变但在代码中是必需的?

变量

有哪些未知数?

在代码执行过程中,哪些值会或可能会发生变化?

国家

1 任何对象或变量的起始状态是什么?

2 任何对象或变量的期望/要求的最终状态是什么?

输出

1 您是否需要提供任何“打印”输出 - 例如,到屏幕或控制台?

2 你是否需要返回任何东西——例如,这是一个返回一个或多个值的函数吗?


所以,考虑到这一点,如果我们看看你的问题:

对象

那里有两个:

汽车 - 完全无关,因为问题中没有任何内容基于车辆类型,因此我们可以忽略此对象

时钟 - 需要以分钟为单位确定时间的流逝。 但是,没有必要将它创建为一个对象,一个变量会处理这个,因为我们实际上只需要知道时钟显示的时间。 据推测,例如汽车的时钟或驾驶员的手表将用于确定时间,但我们没有考虑任何一种,因为我们有自己的确定时间的方法。

我们可以为汽车及其速度创建一个自定义对象。 但是,我们在该对象上维护的唯一值将是速度。 但是,如果我们需要使用不同的时间为多辆车运行代码,我们可以为每辆车创建一个对象。 这里不需要,因为只有一辆车。 同样,时钟的值可以添加到汽车对象中,但同样,我们只需要知道时间,而不是它显示在时钟上或时钟/手表实际存在的事实。

事实

有六个:

1 开始时间

2 变速 1 次

3 变速 2 次

4 结束时间

5 我们每分钟都在检查速度

6 速度取决于时间

这四个时间是静态值,因此我们可以创建变量来保存这些值,代码中的任何内容都不会更改这些值。 通常,这些是使用const创建的,但我在我的代码示例中使用了var

我们每分钟都在检查/更改速度这一事实为我们提供了确定开始时间和结束时间之间的特定时间的理由。 需要一个变量来处理这个问题,因为当前时间值会在代码运行期间发生变化。

国家

有两种初始状态:

1 时间从10:25:21开始

2 我们开始以每小时 6 英里的速度行驶

有一个最终状态:

时间停止在12:00:00

请注意,速度将是代码计算的任何值,因此具有未知的最终状态

输出

在这种情况下,输出将写入文档。 测试时,更常用的是输出到控制台,使用console.log(...)


鉴于所有这些,我们可以看看需要什么代码。

1 创建静态变量——四个时间点

2 创建其他变量 - 速度和当前时间

3 创建一个循环,将我们从“开始时间”移动到“结束时间”,每次一分钟,使用当前时间变量来跟踪我们所处的位置

4 创建 if/else 测试以确定当前时间与静态时间的关系

5 确定当时汽车应该以什么速度行驶

6 输出时间和速度 - 因为我们不在函数中,所以我们根据需要输出到页面或控制台,因为我们没有向其他代码返回值

7 到达“结束时间”后结束循环。

我们可以使用三种类型的循环:

1 a for循环 - 这通常用于迭代集合,通过按索引号引用集合的项目,或提供可在循环内使用的计数器。 因为我们不需要计数器也没有集合,所以我们不会使用它

2 while循环 - 这不依赖于计数器,它只是在开始循环迭代之前测试条件语句。 如果测试失败,则不满足条件且循环不会运行。

3 do/while循环 - 类似于while循环,不同之处在于在第一次迭代后检查条件,因此将至少运行一次。 如果满足条件,则循环再次开始。 我们可以使用它,因为我们知道循环需要至少运行一次。 但是,如果当前时间已经在结束时间之后,我们不希望循环运行,所以我避免了这个循环

还有其他类型的循环可用,例如for/infor/offorEach但这些通常用于对象和集合,因此这里不相关。

因此,最好使用的循环是while循环,因为要求是“...做某事直到...”

所以,现在我们知道了构建代码所需的所有知识。

// Create the static time variables
// Start time
var startTime = new Date();
startTime.setHours(10);
startTime.setMinutes(25);
startTime.setSeconds(21);

// Speed change 1 time
var endTime = new Date();
endTime.setHours(12);
endTime.setMinutes(0);
endTime.setSeconds(0);

// Speed change 2 time
var time1 = new Date();
time1.setHours(10);
time1.setMinutes(36);
time1.setSeconds(21);

// End time
var time2 = new Date();
time2.setHours(10);
time2.setMinutes(46);
time2.setSeconds(21);

// Create the other variables
// "thisTime" is initially set to "startTime" but will be incremented by the loop code
var thisTime = startTime;
// A variable to hold the current speed through the loops
// This could be set to 6, but if the loops don't run (ie, the condition is not met), we would not want the speed to be 6
var speed = 0; 

// Start a loop - check that the current time (thisTime) is less than the endTime
while (thisTime < endTime) {
  // If it is, check if we have reached the first speed change time - "time1"
  if (thisTime < time1) {
    // If we haven't, keep the speed at 6
    speed = 6;
    // If we have, check if we have reached the second speed change time - "time2"
  } else if (thisTime < time2) {
    // If we haven't, the speed is 7
    speed = 7;
    // If we have, we can now increase the speed 1mph for each minute (ie, for all further iterations of the loop)
  } else {
    speed++;
  }
  // Output the time and speed
  document.write(thisTime + ":" + speed + "\n<br>");
  // Add one minute to the thisTime variable which will be tested at the start of the next iteration of the loop
  thisTime.setMinutes(thisTime.getMinutes() + 1);
}

而且,要将这一切转换回英语:

考虑到这四个时间点并每分钟检查我的速度,我从第一个时间点开始驾驶。 如果我还没有到达第二个时间点,我的速度是 6mph。 但是,如果我已经达到了那个,但还没有达到第三个时间点,我的速度是 7mph。 但如果我已经达到了,我会每分钟以 1 英里/小时的速度增加速度。 我在最后一个时间点停止开车。 在整个过程中,我都会记下时间和速度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM