簡體   English   中英

這是遍歷數組的正確方法嗎?

[英]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); 
}

獲取值時使用pop和slice

當需要看一下數組開頭的值時,如果遵循上述有關數組鍵的建議,則可以使用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);

JSFiddle

這是一個完整的JS小提琴內嵌注釋完全符合您的所說。

在這個部分:

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM