Mike Allanson

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