Skip to main content

Array Bouncing Generator

I want to cycle through the values in an array. When I get to the end, I want to cycle back through the values in reverse. I want to do this an unknown number of times.

Given an array like [1, 2, 3, 4], give me the values 1, 2, 3, 4, 3, 2, 1, 2, 3, 4, 3, 2 (etc).

You can do this with a generator function:

function* bounce(values) {
  let step = -1;
  let size = values.length;
  let current = 0;

  while (true) {
    if (size < 2) {
      yield values[0];
    } else {
      yield values[current];
      // reverse direction at array boundary
      if (current === size - 1 || current === 0) step *= -1;
      current += step;
    }
  }
}

Usage:

const myValues = [1, 2, 3, 4, 5];

const valueIterator = bounce(myValues);

let result = "";

// Bounce through the array until we have 20 values
for (let i = 0; i < 20; i++) {
  result += valueIterator.next().value;
}

// Logs "12345432123454321234"
console.log(result);