Javascript for循环跳过最后一个元素

3

我有一个数组,根据一些条件删除某些元素。当删除元素后,由于索引重新排列,我需要重新开始循环。

var k;
for( k=0 ; k < this.j_data.length;k++){
     if(condition === true){
       this.j_data.splice(k, 1);
       k = 0; // restart
     }
}

我的数组this.j_data有两个元素,都应该通过splice删除,但是在删除第一个元素之后,循环跳过了最后一个元素。

有什么想法我错过了什么


2
好的,k++k < 检查之前运行,所以请将 k 设置为 -1 - Jaromanda X
4
除非您有特殊原因需要修改原始数组,否则请考虑使用filter来代替:this.j_data = this.j_data.filter(function(item){return !condition}) - Yury Tarabanko
3个回答

0

for循环在迭代后总是增加索引,因此当您在下一次迭代中设置k=0时,它将被设置为1,因此您永远不会删除位置“1”(数组的第二个元素)。

我认为您应该使用不同类型的循环,即do/while循环,以便在循环内部代码块执行后测试条件,如下所示:

var arr = [1,2,3,4,5];

console.log("Before: " + arr);

(function(j_data, condition){
  var k=0;
  do {
       if(condition === true){
         j_data.splice(k, 1);
         k = 0; // restart
       }else{
         k++;
       }
  } while(k < j_data.length);
})(arr, true);

console.log("After: " + arr);


0

这样你也可以得到最后一个k,因为当k=1时它会停止循环

var k;
for( k=0 ; k <= this.j_data.length;k++){
     if(condition === true){
       this.j_data.splice(k, 1);
     }
}

0

感谢 @Jaromanda X

k++ 先出现,所以 k=-1 修复了这个问题

var k;
for( k=0 ; k < this.j_data.length;k++){
     if(condition === true){
       this.j_data.splice(k, 1);
       k = -1; // restart
     }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接