2017-04-07 75 views
2

我有一个数组,从中删除某些元素的基础上的某些条件,当我删除元素我重新启动循环,因为索引刷新。Javascript for loop跳过最后一个元素

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有两个元素都应该由剪接后却第一个元素删除被删除,最后一个是通过循环跳过。

任何想法我缺少

+2

'k ++'在'k <'检查前运行,所以设置'k = -1'而不是 –

+4

考虑使用'filter'代替:'this.j_data = this.j_data.filter(function(item){return !condition})',除非你有特殊的理由修改原始数组。 –

回答

0

感谢停止循环到@Jaromanda X东阳

ķ++首先发生这样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 
    } 
} 
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

对不起,它不起作用 – user889030

+0

@ user889030改变了它现在的工作? – IEssing

0

for loop always inc在迭代之后再次检索索引,因此当您在下一次迭代中设置k=0时,它将设置为1,因此您永远不会删除pos“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);