Использовать по модулю ..
function getPreviousOrNext(now, max, direction) {
totalOptions = max + 1; //inlcuding 0!
newNumber = now; // If direction is unclear, the number will remain unchanged
if (direction == "next") newNumber = now + 1;
if (direction == "prev") newNumber = now + totalOptions - 1; //One back is same as totalOptions minus one forward
return newNumber % totalOptions;
}
(может быть короче, но это делает его более понятным)
Редактировать: "now + totalOptions - 1" не позволяет нам перейти к отрицательным числам (-1% 7 = -1)
Edit2: Ой, в коде произошла небольшая ошибка ... "Если направление неясно, номер останется неизменным", неверно!
Edit3: И для бонуса, это то, как я написал бы это перед чтением Code Complete ;-) (предполагается, что это «следующий», когда это не «предыдущий»). Это уродливо и красиво в одном:
function getPreviousOrNext(now, max, direction) {
return (now + ((direction=="prev")?max:1)) % (max + 1);
}