循环变量

时间:2018-08-03 11:25:56

标签: javascript

如果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 个答案:

答案 0 :(得分:4)

为什么不内联?! ;)

var start = startPageIndex;
for (var i = start; (reverse && i >= 0) || (!reverse && i < length); reverse ? --i : ++i) { }

答案 1 :(得分:3)

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

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

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

for (var i = 0; i < length; i++) {
    var j = i;
    if (reverse) {
        j = length - (i + 1);
    }

    // ...then use j instead of i
}

答案 2 :(得分:1)

如果要使其动态化,我不会使用for循环,而是使用do..while循环来更易于自定义。

您的主要功能只有一个简单的反向布尔标志,您可以通过它。

在要依赖反向标志的函数中,可以在条件(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);

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

答案 3 :(得分:0)

选中https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions

  

原始参数(例如数字)通过值传递给函数;值将传递给函数,但是如果函数更改了参数的值,则此更改不会在全局或调用函数中反映出来。

当您调用increment1(i),for循环中的外部i不变时,会发生这种情况。要解决此问题,只需从增量1(i)的返回值中设置i

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

答案 4 :(得分:0)

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

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]);
}

答案 5 :(得分:0)

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

下面,我创建了一个名为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