[英]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/in
、 for/of
和forEach
但這些通常用於對象和集合,因此這里不相關。
因此,最好使用的循環是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.