Итерация по диапазону в обоих направлениях - PullRequest
1 голос
/ 28 сентября 2019

Существует очень распространенная и простая задача циклической итерации по некоторому диапазону в обоих направлениях:

var currentIndex = 0;
var range = ['a', 'b', 'c', 'd', 'e', 'f'];

function getNextItem(direction) {
    currentIndex += direction;
    if (currentIndex >= range.length) { currentIndex = 0; }
    if (currentIndex < 0) { currentIndex = range.length-1; }

    return range[currentIndex];
}        
// get next "right" item
console.log(getNextItem(1));

// get next "left" item
console.log(getNextItem(-1));

Приведенный выше код работает отлично, но я потратил около часа, пытаясь избавиться от двойной проверки if.

Есть ли способ решить, если без, если?Вроде однострочник может быть?

1 Ответ

5 голосов
/ 28 сентября 2019

Чтобы превратить два if в один безусловный оператор, вы можете добавить range.length к currentIndex и затем использовать по модулю:

var currentIndex = 0;
var range = ['a','b','c','d','e','f'];

function getNextItem(direction) {
    currentIndex = (currentIndex + direction + range.length) % range.length;
    return range[currentIndex];
}

// get next "right" item
console.log(getNextItem(1));
console.log(getNextItem(1));

// get next "left" item
console.log(getNextItem(-1));
console.log(getNextItem(-1));
console.log(getNextItem(-1));

console.log(getNextItem(4));
console.log(getNextItem(1));
console.log(getNextItem(1));
console.log(getNextItem(1));
...