我构建了一个JavaScript for循环,其运行条件设置为选项Collection的长度。选项Collection的长度在循环之前通过console.log在27处验证。
但是当我运行循环时,它似乎只运行了14次 - 循环每次迭代都会删除一个选项,当它完成时,剩下13个选项。我也在循环之后运行console.log。
这是JSFiddle。
这是我的for循环:
(function () {
var industryOptions = document.getElementsByName("industry")[0].options;
console.log(industryOptions.length);
for (var k = 0; k < industryOptions.length; k++) {
industryOptions.remove(0);
}
console.log(industryOptions.length);
})();
注意:当我将条件从industryOptions.length
更改为27时,它会按预期工作。
为什么我的for循环在14个循环之后提前停止而不是整个industryOptions.length
?谢谢!
答案 0 :(得分:6)
industryOptions.remove(0);
即使您要添加数字,也会不断更改数组的长度。您需要使用不同的算法或技术。
一种方法是简单地重复直到数组为空:
while (industryOptions.length > 0)
{ industryOptions.remove(0); }
你可以从最后倒数而不是数数:
for (var k = industryOptions.length; k > 0 ; k -= 1)
{ industryOptions.remove(0); }
另一种技术是在循环开始之前确定长度,而不是在每次迭代时重新评估长度:
var loopStop = industryOptions.length;
for (var k = 0; k < loopStop; k += 1)
{ industryOptions.remove(0); }
或者你可以避免自己做这项工作并让阵列处理它:
industryOptions.splice(0, industryOptions.length);
另见this existing answer from 2009: How do I empty an array in JavaScript?
答案 1 :(得分:2)
当你在每个循环上splice()
时,数组被重新索引并且其长度减少而数字循环是固定的(在循环语句中设置的原始数组长度)。循环逻辑被破坏了。
尝试反转数组循环顺序。替换:
for (var k = 0; k < industryOptions.length; k++) {
使用:
for(var k = industryOptions.length; k--;) {
答案 2 :(得分:1)
(function () {
var industryOptions = document.getElementsByName("industry")[0].options;
console.log(industryOptions.length);
var length = industryOptions.length;
for (var k = 0; k < length; k++) {
industryOptions.remove(0);
}
console.log(industryOptions.length);
})();
在每次迭代中,您都会检查industryOptions的长度,以便您的for循环提前结束
答案 3 :(得分:0)
正如user3087839指出的那样,每次删除某个项目时,它会缩短industryOptions
的长度,导致它在您预期之前结束。为避免这种情况,请使用预定义的长度进行检查,如下所示:
(function () {
var industryOptions = document.getElementsByName("industry")[0].options;
console.log(industryOptions.length);
var industryOptionsLength = industryOptions.length;
for (var k = 0; k < industryOptionsLength; k++) {
industryOptions.remove(0);
}
console.log(industryOptions.length);
})();
答案 4 :(得分:0)
这是因为行industryOptions.remove(0);
正在影响industryOptions对象本身。更具体:在每for
次迭代中,您将industryOptions
对象的长度减1;您将删除一个元素,然后验证循环条件(在下一次迭代开始之前)所以你要比较你刚修改的对象的长度。换句话说,当您使用industryOptions.length
时,第一次迭代将检查k < 27
,第二次迭代将检查k < 26
,第三次迭代将检查k < 25
等等。在某些时候k
将等于industryOptions.length
,循环将停止。那一点是k == industryOptions.length == 14