【问题标题】:Javascript for loop skips last elementJavascript for循环跳过最后一个元素
【发布时间】:2017-04-07 09:51:15
【问题描述】:

我有一个数组,根据某些条件从其中删除某些元素,当我删除元素时,我重新启动 for 循环,因为索引已刷新。

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 有两个元素都应该被拼接删除但是在第一个元素被删除之后,最后一个被循环跳过。

知道缺少什么

【问题讨论】:

  • 好吧,k++k &lt; 检查之前运行,所以,改为设置k = -1
  • 考虑使用filter 代替:this.j_data = this.j_data.filter(function(item){return !condition}),除非您有特殊原因要修改原始数组。

标签: javascript


【解决方案1】:

感谢@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
     }
}

【讨论】:

    【解决方案2】:

    for 循环总是在迭代后递增索引,因此当您在下一次迭代中设置 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);

    【讨论】:

      【解决方案3】:

      这样你得到最后一个k 也是因为当k=1 它停止循环

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

      【讨论】:

        猜你喜欢
        • 2019-01-01
        • 2015-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多