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

有条件地改变“for循环”的方向?

  •  2
  • Moshe  · 技术社区  · 14 年前

    是否可以有条件地更改ActionScript中for循环的方向?

    例子:

    for(if(condition){var x = 0; x<number; x++}else{var x=number; x>0; x--}){
      //do something
    }
    
    3 回复  |  直到 14 年前
        1
  •  9
  •   Matthew Flaschen    14 年前

    有趣的要求。保持for的一种方法是:

    var start, loop_cond, inc; 
    if(condition) 
    { 
        start = 0; 
        inc = 1; 
        loop_cond = function(){return x < number}; 
    } 
    else 
    { 
        start = number - 1; 
        inc = -1; 
        loop_cond = function(){return x >= 0}; 
    } 
    for(var x = start; loop_cond(); x += inc) 
    { 
        // do something
    }
    

    我们设置起始值,终止条件的函数,以及正增量或负增量。然后,我们调用函数并使用 += 做递增或递减。

        2
  •  6
  •   xscott    14 年前

    ActionScript有三元运算符,因此您可以执行以下操作:

    for (var x = cond ? 0 : number; cond ? x < number : x > 0; cond ? x++ : x--) {
    }
    

    但这很难看。:-)

    你可能还需要/想在这些东西周围放些小点心。我不确定运算符的优先级。

    您还可以考虑使用更高阶函数。假设你有:

    function forward (count, func) {
        for (var x = 0; x < count; x++) {
            func(x);
        }
    }
    
    function backward (count, func) {
        for (var x = count - 1; x >= 0; x--) {
            func(x);
        }
    }
    

    然后你可以:

    (condition ? forward : backward) (number, function (x) {
         // Your loop code goes here
    })
    
        3
  •  1
  •   Josh Andreas Rehm    14 年前

    你可能想要一个 while 取而代之的是循环:

    var continueLooping, x;
    
    if(condition)
    {
      x = 0
      continueLooping = (x < number);
    }
    else
    {
      x = number;
      continueLooping = (x > 0);
    }
    
    while (continueLooping)
    {
      // do something
      if(condition)
      {
        x++;
        continueLooping = (x < number);
      }
      else
      {
        x--;
        continueLooping = (x > 0);
      }
    }
    

    如果您真的需要for循环,应该使用其中两个:

    function doSomething()
    {
      //doSomething
    }
    
    if(condition)
    {
      for(var x = 0; x<number; x++)
      {
        doSomething(x);
      }
    }
    else
    {
      for(var x=number; x>0; x--})
      {
        doSomething(x);
      }
    }