Vico
Vico

Reputation: 1256

Variable for loop

If reverse == true I want to run one kind of loop, else I want to run another one.

Currently, here is an example of my code:

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

The code inside is really big, and is quite the same. I could use a function, but this function would have so many params that is not a good choice.

So I've tried to do something like that:

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)) {

But now I have an infinite loop.

Any idea on how to solve this issue?

Upvotes: 3

Views: 102

Answers (6)

qxg
qxg

Reputation: 7036

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

Primitive parameters (such as a number) are passed to functions by value; the value is passed to the function, but if the function changes the value of the parameter, this change is not reflected globally or in the calling function.

This is what happens when you call increment1(i), outer i in for loop is not changed. To fix it just set i from increment1(i)'s return value.

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

Upvotes: 0

Keith
Keith

Reputation: 24181

How about a simple loop function,

Below I've created a simple function called myLoop, were you can pass the length, if it's reversed, and what callback you want for each loop iteration.

eg.

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

Upvotes: 0

eisbehr
eisbehr

Reputation: 12452

Why not do it inline?! ;)

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

Upvotes: 4

Loop
Loop

Reputation: 237

If you want to make it dynamic, I wouldn't use a for loop, but a do..while loop to be easier to customize.

Your main function would just have a simple reverse bool flag and you could just pass that.

Inside that function that you want to depend on the reverse flag, you can use the ternary expression in the condition (x ? y : z)

Makes it clearer to read. In theory you can do it in a for loop directly, using two ternary directions.

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

Ideally, in these situations I would consider using iterators.

Upvotes: 1

Adelin
Adelin

Reputation: 8199

I would opt for the same code, just change the array.

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

Upvotes: 0

BambooleanLogic
BambooleanLogic

Reputation: 8161

Assuming the specific case is to traverse through an array either backwards or forwards, there are two simple ways to do that.

1) Just conditionally reverse the array before looping, or

2) Use a single loop but conditionally map the loop variable to something else. Something like...

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

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

Upvotes: 3

Related Questions