2017-04-07 114 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);