предыдущий / следующий в диапазоне чисел - PullRequest
0 голосов
/ 23 сентября 2010

Привет всем .. Мне нужна функция, которая будет возвращать предыдущее и следующее число, но только в пределах моего диапазона номеров. так, например, если мой диапазон от 0 до 7, и я на 6 - следующий должен вернуть 7. если я на 7 - следующий должен вернуть 0 (оно обведено обратно).

то же самое для предыдущего, если im на 0, предыдущий должен быть 7. Я думаю, что по модулю можно это выяснить, но не могу понять, как. функция должна принимать 3 аргумента: текущее число, на котором мы находимся, максимальное число и, если мы идем назад или вперед. что-то вроде

getPreviousOrNext (0, 7, «следующий» или «предыдущий»)

спасибо !!!

Ответы [ 3 ]

2 голосов
/ 23 сентября 2010

Использовать по модулю ..

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);
}
1 голос
/ 23 сентября 2010
var cycle_range = function (high, current) {
    return new function () {
       this.next = function () {
           return current = (current+1) % (high+1);
       };

       this.previous = function () {
           return current = (current+high) % (high+1);
       };
    }
};

cycle_range(7, 0).next() // 1

var the_range = cycle_range(7, 0);
the_range.next() // 1
the_range.next() // 2
the_range.previous() //1
the_range.previous() //0
the_range.previous() //7
1 голос
/ 23 сентября 2010

это домашнее задание?
Я бы не использовал по модулю, достаточно горстки операторов if /.

...