[英]Is this the right way to iterate through an array?
這是有問題的代碼:
var L1 = [];
var Q1 = [];
function populateListOne() {
var limit = prompt("please enter a number you would like to fill L1 to.");
for (i = 2; i <= limit; i++) {
L1[i] = i;
}
for (n = 2; n <= L1.length; n++) {
var count = 2;
if (n == count) {
var index = L1.indexOf(n);
L1.splice(index, 1);
Q1[n] = n;
count = count + 1;
}
for (j = 0; j <= L1.length; j++) {
if (L1[j] % 2 == 0) {
var secondIndex = L1.indexOf(j);
L1.splice(secondIndex, 1);
}
}
}
document.getElementById("demo").innerHTML = "iteration " + "1" + ": " + L1 + " Q1 = " + Q1;
}
我目前正在做作業,需要設置隊列。 所有這些都在我的JSFiddle中進行了解釋。
本質上,我卡住的部分是遍歷數組的每個實例,然后在模數等於0時取出值。但是,正如您在運行程序時所看到的那樣,它並不能解決該問題方式。 我知道問題出在第二個for循環中,我只是看不到我在做什么錯。
我的閱讀方式是,如果j
小於數組的長度,則遞增。 然后,如果L1[j]
模數2的索引值secondIndex
0,則將secondIndex
的值設置為j
的索引值。 然后將其splice
出來。 因此,從理論上講,只應刪除可被二整除的數字。
單個數字limit
,它將用於填充數組L1
。
L1
將使用值2、3,... limit
初始化。
獲取數組L1
的起始元素並將其放在數組Q1
。
使用該元素,刪除數組L1
中所有可被該數字整除的值。
重復直到數組L1
為空。
如果要在循環中更改數組,將在遍歷數組時遇到問題。 為了解決這個問題,我傾向於從后到前進行迭代(也請注意:從array.length - 1
進行迭代,因為length
元素不存在,所以數組是從0開始鍵入的):
for(j = L1.length - 1; j >=0 ; j--)
對於您的第一個循環,您會錯過元素L1[0]
和L1[1]
,因此我將第一個循環更改為:
L1 = [];
for(i = 2; i <= limit; i++)
{
L1.push(i);
}
您的初始代碼使用了一個初始化為從索引2開始的數組。為避免混淆,從哪個索引開始, 從索引0開始並進行迭代,直到array.length
而不是預定義的值limit
以確保您遍歷每個元素。
以下內容仍然有效,但更讓人頭疼,因為您需要記住從哪里開始以及何時結束。
for (i = 2; i <= limit; i++) {
L1[i] = i; // 'i' will begin at two!
}
這是一個更好的方法:
for (i = 2; i <= limit; i++) {
// 'i' starts at 2 and since L1 is an empty array,
// pushing elements into it will start index at 0!
L1.push(i);
}
當需要看一下數組開頭的值時,如果遵循上述有關數組鍵的建議,則可以使用L1[0]
。
但是,當您確定需要刪除數組的起始元素時,請使用Array.slice(idx, amt)
。 idx
指定從哪個索引開始,而amt
指定從該索引(包括)開始刪除多少個元素。
// Go to 1st element in L1. Remove (1 element at index 0) from L1.
var current = L1.splice(0, 1);
為了使您的生活更輕松,請在必要時使用適當的循環。 當您確切知道要迭代多少次時,將使用for循環。 在期待事件時使用while循環。
在您的情況下,“重復直到L1為空”直接轉換為:
do {
// divisibility checking
} while (L1.length > 0);
在這個部分:
for(j = 0; j <= L1.length; j++){
if(L1[j] % 2 == 0)
{
var secondIndex = L1.indexOf(j);
L1.splice(secondIndex, 1);
}
}
您應該使用j而不是secondIndex進行拼接。
更改L1.splice(secondIndex,1); 到L1.splice(j,1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.