在一系列数字中的上一个/下一个

时间:2010-09-22 22:21:26

标签: numbers

嘿所有..我需要一个能够返回前一个和下一个数字的函数,但仅限于我的数字范围内。 所以,例如,如果我的范围从0到7,并且我在6 - 下一个应该返回7.如果我在7 - 下一个应该返回0(它圈回到它)。

以前相同,如果我在0,之前应该是7.我认为modulo可以用来计算出来,但是无法弄清楚如何。该函数应该采用3个参数 - 我们所在的当前数字,最大数量,如果我们要返回或前进。

之类的东西

getPreviousOrNext(0,7,“next”或“prev”)

感谢!!!

3 个答案:

答案 0 :(得分:2)

使用modulo ..

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:哎呀,代码中有一个小错误......“如果方向不清楚,数字会保持不变”是不正确的!

编辑3:为了获得奖金,这就是我在阅读代码完成之前所写的内容;-)(假设它不是“上一个”时它是“下一个”)。这在一个方面是丑陋和美丽的:

function getPreviousOrNext(now, max, direction) {
   return (now + ((direction=="prev")?max:1)) % (max + 1);
}

答案 1 :(得分:1)

这是一项家庭作业吗?
我不会使用modulo,少数if / ternary语句就足够了。

答案 2 :(得分:1)

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