Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-循环数组比我应该的少_Javascript_Arrays_Loops - Fatal编程技术网

JavaScript-循环数组比我应该的少

JavaScript-循环数组比我应该的少,javascript,arrays,loops,Javascript,Arrays,Loops,我试图循环一个数组,该数组包含由ClassName返回的元素列表,但我无法循环所有元素,因为下一种情况: var list = document.getElementsByClassName('class'); for (var i = 0; i < list.length; i++) { var theClass = list[i].className; //once got list[i]. theClass = theClass.replace('class', '

我试图循环一个数组,该数组包含由ClassName返回的元素列表,但我无法循环所有元素,因为下一种情况:

var list = document.getElementsByClassName('class');

for (var i = 0; i < list.length; i++) {
    var theClass = list[i].className; //once got list[i].
    theClass = theClass.replace('class', '');
    list[i].className = theClass; //twice got list[i].
}
var list=document.getElementsByClassName('class');
对于(变量i=0;i

如果列表的大小为=4,我可以循环两次,因为每个循环的每个位置我得到两次。你知道我能做什么,为什么会这样吗?谢谢。

getElementsByClassName返回的数据结构类似于数组,并且基于DOM是动态的。一旦替换了相关列表项上的类,每次迭代都会丢失一个项

要解决这个问题,您可以在对返回值进行操作之前先获取其副本,或者向后操作

复印一份:

var list = document.getElementByClassName('class')

var realList = []
Array.prototype.push.apply(realList, list)

for (var i = 0; i < realList.length; i++) {
 // do changes as you have already
}
另一张海报简要地提到了一个while循环,它也可以工作,但随后他们的答案就消失了(我不想为此承担责任!):

如果写出初始代码中发生的情况,可以更清楚地看到问题:

Iteration 1: i=0, list=[a,b,c,d], length = 4, list[i]=a
Iteration 2: i=1, list=[b,c,d], length = 3, list[i]=c
Before Iteration 3: list=[b,d], i=2, length = 2, loop breaks
现在写出使用反向循环时发生的情况:

Iteration 1: i=3, list=[a,b,c,d], length = 4, list[i]=d
Iteration 2: i=2, list=[a,b,c], length = 3, list[i]=c
Iteration 3: i=1, list=[a,b], length = 2, list[i]=b
Iteration 4: i=0, list=[a], length = 1, list[i]=a

所有这些解决方案都是这个解决方案的变体,避免使用i引用数组的中间部分,如getElementsByCassName的结果值,以便处理它的动态特性。

您能给我们提供一个失败的JSFIDLE.net示例吗?不需要费心去解决这个问题。无论如何,这里有一个JSFIDLE:我不知道返回的数组类型。关于换班的事对我来说很可疑。谢谢我会倒着干的,看起来不错!是的,它工作得很好:附言:为什么向后工作不受影响?非常感谢,给我一个新的提示。@jhorapb,我更新了我的答案来回答你的最后一个问题。解释清楚。当然,当我回溯时,索引会随着列表的大小而变短,但它仍然可以用于获取值。好的,谢谢。
Iteration 1: i=0, list=[a,b,c,d], length = 4, list[i]=a
Iteration 2: i=1, list=[b,c,d], length = 3, list[i]=c
Before Iteration 3: list=[b,d], i=2, length = 2, loop breaks
Iteration 1: i=3, list=[a,b,c,d], length = 4, list[i]=d
Iteration 2: i=2, list=[a,b,c], length = 3, list[i]=c
Iteration 3: i=1, list=[a,b], length = 2, list[i]=b
Iteration 4: i=0, list=[a], length = 1, list[i]=a