代码之家  ›  专栏  ›  技术社区  ›  Vico

循环变量

  •  3
  • Vico  · 技术社区  · 7 年前

    如果 reverse == true 我想运行一种循环,否则我想运行另一种循环。

    目前,我的代码示例如下:

    if (reverse) {
        for (var i = 0; i < length; i++) {
            ...
        }
    } else {
        for (var i = length; i >= 0; i--) {
            ...
        }
    }
    

    里面的代码非常大,而且是完全相同的。我可以使用一个函数,但是这个函数会有很多参数,这不是一个好的选择。

    所以我试着这样做:

    var loopStart1 = startPageIndex;
    if (!reverse) {
        condition1 = function(i) {
             return i < length;
        }
        increment1 = function(i) {
             return ++i;
        }
    } else {
        condition1 = function(i) {
            return i >= 0;
        }
        increment1 = function(i) {
            return i--;
        }
    }
    mainLoop: for (var i = loopStart1; condition1(i); increment1(i)) {
    

    但现在我有一个无限循环。

    你知道怎么解决这个问题吗?

    6 回复  |  直到 7 年前
        1
  •  0
  •   Keith    7 年前

    一个简单的循环函数怎么样,

    下面我创建了一个简单的函数 myLoop ,如果你能通过 length ,如果是 reversed ,以及每次循环迭代所需的回调。

    如。

    function myLoop(length, reverse, each) {
      var index;
      if (!reverse) {
        for (index = 0; index < length; index ++) each(index);
      } else {
        for (index = length -1; index >= 0; index --) each(index);
      }
    }
    
    
    function show(index) {
      console.log("Loop index = " + index);
    }
    
    console.log("forward");
    myLoop(5, false, show);  //normal
    console.log("revere");
    myLoop(5, true, show);   //reversed
        2
  •  4
  •   eisbehr    7 年前

    为什么不直接做呢?! ;)

    var start = startPageIndex;
    for (var i = start; (reverse && i >= 0) || (!reverse && i < length); reverse ? --i : ++i) { }
    
        3
  •  3
  •   BambooleanLogic    7 年前

    假设特定情况是向后或向前遍历数组,有两种简单的方法可以做到这一点。

    1)在循环之前有条件地反转数组,或者

    2)使用单个循环,但有条件地将循环变量映射到其他对象。有点像。。。

    for (var i = 0; i < length; i++) {
        var j = i;
        if (reverse) {
            j = length - (i + 1);
        }
    
        // ...then use j instead of i
    }
    
        4
  •  1
  •   eisbehr    7 年前

    如果您想使它动态化,我不会使用for循环,而是使用do..while循环,这样更易于自定义。

    您的主函数将只有一个简单的反向bool标志,您可以直接传递它。

    在要依赖于反向标志的函数中,可以在条件中使用三元表达式 (x ? y : z)

    使阅读更清晰。理论上,你可以直接在for循环中使用两个三元方向。

    do {
    
        //Your actions here, using i as counter
    
        //Here you will do the counter direction change
        if(reverse)
          i--;
        else
          i++;
    
      // Use ternary expression if (x ? y : z) in the while condition
      // Reads as: If x is true, do y, else do z
      // All in one line
    } while(reverse ? i>=0 : i<n);
    

    理想情况下,在这些情况下,我会考虑使用迭代器。

        5
  •  0
  •   Adelin    7 年前

    我会选择相同的代码,只需更改数组。

    var array = ['one', 'two', 'three'];
    var reversed = true;
    
    let arrToUse = reversed ? array.reverse() : array;
    
    for (var i = 0; i < arrToUse.length; i++) {
      console.log(arrToUse[i]);
    }
        6
  •  0
  •   qxg    7 年前

    支票 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

    基本参数(如数字)按值传递给函数;值传递给函数,但如果函数更改参数值,则此更改不会全局反映或在调用函数中反映。

    这就是你打电话的时候 increment1(i) ,外部 i in for循环未更改。把它修好 从增量1(i)的返回值。

    mainLoop: for (var i = loopStart1; condition1(i); i = increment1(i)) {