下面是所讨论的代码:
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相同,则取值。但是,正如您所看到的,当我运行这个程序时,它并不是这样的。我知道问题在第二个循环,我只是不知道我做错了什么。
我读取它的方式是,如果j小于数组的长度,则增量。然后,如果L1[j]模数2的指数与0相同,则将secondIndex的值设为j的任何指数。那就splice出来。因此,理论上,只有可以被二除的数字才应该被删除。
输入
一个数字limit,用于填充数组L1。
L1将被初始化为值2、3、. limit。
流程
获取数组L1的起始元素,并将其放在数组Q1中。
使用该元素,删除数组L1中可被该数字整除的所有值。
重复,直到数组L1为空。
发布于 2015-08-09 03:05:20
如果要在循环中更改数组,则在遍历数组时会出现问题。为了帮助解决这个问题,我倾向于从后面迭代到前面(还请注意:由于不存在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);
}发布于 2015-08-09 03:19:06
数组索引和放置条目
初始代码使用了一个从索引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和片
当您需要查看数组开始时的值时,如果您按照我上面关于数组键的建议,可以使用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循环。当您期待一个事件时,请使用when循环。
在您的例子中,“重复直到L1为空”直接转换为:
do {
// divisibility checking
} while (L1.length > 0);JSFiddle
这是一个完整的JS小提琴,它的评论与您所说的完全一致。
发布于 2015-08-09 03:22:36
在本节中:
for(j = 0; j <= L1.length; j++){
if(L1[j] % 2 == 0)
{
var secondIndex = L1.indexOf(j);
L1.splice(secondIndex, 1);
}
}您应该使用j而不是secondIndex进行拼接。
将L1剪接(secondIndex,1)改为L1剪接(j,1);
https://stackoverflow.com/questions/31900416
复制相似问题