2010-09-22 75 views
0

嘿所有..我需要一个函数,将返回一个前一个和下一个数字,但只在我的数字范围内。例如,如果我的范围是从0到7,并且im在6 - 下一个应该返回7.如果im在7 - 下一个应该返回0(它回到它)。前一个/下一个数字范围内

与以前相同,如果im为0,以前应该是7.我认为modulo可以用来解决这个问题,但不知道如何。该函数应该有3个参数 - 我们所在的当前编号,最大编号以及我们是前进还是后退。像

getPreviousOrNext(0,7, “下一步” 或 “上一页”)

感谢!

回答

1

这是一个家庭作业?
我不会使用模数,一些if/ternary语句应该是足够的。

+0

没有它不是..其工作...但我不想使用一堆如果else语句...孤单一定有更简单的方法。 – toli 2010-09-22 22:26:13

+1

是的,if/else很难。 – GZipp 2010-09-22 22:41:50

+0

我觉得他的观点可能是if/else不是优雅 – Mark 2010-09-22 22:44:47

2

使用模..

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; 
} 

(可以更短,但是这使得它更容易理解)

编辑: “现在+共TOTALOPTIONS - 1” 阻止我们进入负数( - 1%7 = -1)

Edit2:Ouch,代码中有一个小错误...“如果方向不清楚,数字将保持不变”是不正确的!

编辑3:为了获得奖励,这是我在阅读代码完成之前将它写出来的原因;-)(假设它不是'prev'就是'next')。这是丑陋和美丽的一个:

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

不错。 ----- – webbiedave 2010-09-22 22:35:45

+0

以为我发现了一个错误,但不,它很漂亮! :) +1 – DashK 2010-09-22 23:21:41

+0

是的,很好的,谢谢! – toli 2010-09-24 14:11:25

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 
+0

OO解决方案,很好! – Jochem 2010-09-23 07:23:58

相关问题