基于条件,每个循环增加一个循环变量多次

时间:2015-11-11 22:29:38

标签: javascript html arrays for-loop

假设我有一个for循环,并且在某些条件下我想增加我的控制变量(i)的值,以便跳过下一个元素循环,例如:

for (var i = 0; i < arr.length; i++) { 
  if (someCondition) {
    // Call a function and increment i in order to skip the next item
    callFunction(arr[i], arr[++i]);
  } else {
    // Do something else
  }
}

虽然这种方法很好,但是我很关心做这样的事情是多么好的做法:

  • 第一眼就清楚了解到了什么?
  • 这是一种不好的做法吗?
  • 我可以有意想不到的副作用吗?

提前致谢。

4 个答案:

答案 0 :(得分:2)

您可以存储一个布尔值,指示它是否应该跳过下一个项目:

var skip = false;

for (var i = 0; i < arr.length; i++) {
    if (skip == true) {
        skip = false;
        continue;
    }
    if (someCondition) {
        skip = true;
        callFunction(arr[i], arr[i + 1]);
    } else {
        // Do something else
    }
}

答案 1 :(得分:1)

除了增加代码和if语句

之外,您甚至可以使用continue关键字跳过所需的迭代

您的代码看起来像

for (var i = 0; i < arr.length; i++) { 
  if (someCondition)
    continue;
    callFunction(arr[i], arr[++i]);
}

答案 2 :(得分:1)

  
      
  • 第一眼就清楚了解到了什么?
  •   

或多或少。 乍一看,读者可以认为循环运行length次,而实际上它可以运行一半时间。 无论如何,通过查看代码,即使没有经验丰富的开发人员,也很清楚会发生什么。 问题必须是:它易于阅读吗? 至少对我来说并非如此。我更倾向于使用对象,因为它更容易理解,但它也有其缺点(创建对意味着拥有更多对象周围,​​需要去除它们等等。)

  
      
  • 这是一种不好的做法吗?
  •   

不,它不是。 通常使用连续内存来分配向量,所以作为一个例子,在某些情况下,从你的CPU缓存中获得最佳效果是值得的(在这里有一对可能或不会导致derefer东西,从而使你的努力无效 - 尝试考虑如何在JavaScript中实现。 当然,这只是一个例子,但它应该提出这样的想法,即实践也取决于预期的目标。 甚至几乎所有人的goto都是在内核中发现它的用法,但你有没有听过有人称之为好习惯?

  
      
  • 我可以有意想不到的副作用吗?
  •   

嗯,在这种情况下,一旦输入if,就不会严格检查数组的长度。由于这一点以及JavaScript的工作方式,您必须准备好至少看到此循环中推送的undefined值。 正如有人在评论中所说的那样,这种方法是一种很好的方法来掩盖代码中的错误,因为你假设调用者已经为你正确构建了数组。迟早,有人会犯错误,你可能会驱逐那个从你的团队那里编写代码的人。

注意

这个评论是最糟糕的部分,的确如此:

  

//调用一个函数并递增i以跳过下一个项目

这里你不是简单地试图跳过一个元素,而是将它作为参数传递给被调用的函数。如果您还接收该函数作为参数(例如,该排序算法并且该函数是您的 less 运算符),这样您就会介绍一个冒险的调用,可能会导致异常抛出。

不太好。 : - )

答案 3 :(得分:0)

为什么要跳过循环中的元素?

无论如何我应该使用一个特定的变量来避免强制增量,这可能会产生一些问题。

我会这样写:

var skip = false;
for (var i = 0; i < arr.length; i++) { 
    if(skip == false) {
        if (someCondition) {
        // change skip value
        skip = true;
      } else {
        // Do something else
      }
    }
    else {
        //reset skip value to false in order to go on with your loop and do nothing else
        skip = false;
    }

}