将索引保持在边界内并环绕

Ben*_*ier 3 javascript

我正在用传呼机做一个小旋转木马.旋转木马显示6乘6的元素,我有36个要显示的元素.我有一个下一个和上一个按钮.显示的第一个元素是[0,6].如果我按下前一个按钮并且没有先前的元素(例如我在第一页),它应该环绕并结束.这同样适用于最后的元素和下一个按钮.

我的代码看起来像这样:

$('#img_prev').click(function (e) {
    # change this line so it wraps around
    imgIndex = (imgIndex - 6) % 36;
    alert(imgIndex)
    refreshImages(imgIndex);
    e.preventDefault();
    return false;
});
$('#img_next').click(function (e) {
    imgIndex = (imgIndex + 6) % 36;
    refreshImages(imgIndex);
    e.preventDefault();
    return false;
});
Run Code Online (Sandbox Code Playgroud)

并且它失败了,因为-6%36是-6而不是30.我可以用if来处理它,(index < 0) ...但我更喜欢具有最好捕获包装行为的模数的条件.

我怎样才能将其包裹起来(见第2行)?

Ben*_*ier 7

一个可能的解决方案是这个答案:

function mod(x, m) {
    return (x%m + m)%m;
}

$('#img_prev').click(function (e) {
    # this line has been changed, now it wraps around
    imgIndex = mod(imgIndex - 6, 36);
    ...
Run Code Online (Sandbox Code Playgroud)

  • 不,你实际上是对的——如果我们在这里试图“包含”的索引已经_非常_越界(在代码的其他地方或其他地方进行了处理),例如`-41`,那么我们将得到`(-41+ 36)%36 = -5` 与我的建议 - 所以首先对输入值进行取模确实有其资格:`(-41%36+36)%36 = 31` (2认同)