这是迭代数组的正确方法吗?

时间:2015-08-09 02:47:47

标签: javascript arrays loops

以下是相关代码:

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的索引的值与0相同,则将secondIndex的值设置为j的索引。然后splice出来了。因此,从理论上讲,只能删除可被2整除的数字。

输入

单个数字limit,用于填充数组L1

L1将使用值2,3,... limit初始化。

过程

获取数组L1的起始元素并将其放在数组Q1中。

使用该元素,删除数组L1中可被该数字整除的所有值。

重复直到数组L1为空。

3 个答案:

答案 0 :(得分:0)

如果要在循环中更改数组,则会遇到循环数组的问题。为了解决这个问题,我倾向于从后到前迭代(另请注意:从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);           
}

答案 1 :(得分:0)

数组索引和放置条目

您的初始代码使用了一个初始化为从索引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循环。

在您的情况下,&#39;重复直到L1为空&#39;直接翻译为:

do {
    // divisibility checking
} while (L1.length > 0);

的jsfiddle

这里有一个完整的JS fiddle内嵌评论,完全按照您的说法完成。

答案 2 :(得分: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);