Javascript"发条算术"

时间:2015-05-29 14:50:45

标签: javascript

我试图记住一些名为"发条算术"在我很久以前在关于幻灯片/旋转木马的教程中读过的Javascript中。 (术语可能有误,因为我无法在谷歌找到任何有用的东西)

这是以下代码的简写:

a = a + 1;
if (a > total) a = 0;

基本上它是递增直到它达到总数,当它达到总数时它将重置回0.这主要用于创建轮流,它将无限滚动,因为它总是滚动回到开头(索引0)

有没有人如何使用上述发条算法在1行中编写上述2行代码?我认为它使用了"余数" operator%但我不记得其他的东西。

4 个答案:

答案 0 :(得分:5)

这称为modular arithmetic,有效地用于时钟:

  

熟悉的模数运算使用的是12小时制,其中   这一天分为两个12小时。如果现在时间是7点,   然后8小时后它将是3:00。通常的添加会暗示   以后的时间应该是7 + 8 = 15,但这不是答案   因为时钟时间"包裹"每12个小时

在JavaScript中,您可以使用modulo operations

执行% operator
  

%运算符从隐含的运算符中产生其余的操作数   师;左操作数是被除数,右操作数是   除数。

一些等效的例子:

a = (a+1) % total;
a = ++a % total;
++a, a %= total;

答案 1 :(得分:1)

我还没有机会对此进行验证,但我认为它看起来像这样:

a = a < total ? a++ : 0;

答案 2 :(得分:1)

你可以用三元组来做到这一点,不过我觉得这会使代码难以阅读,因此维护性较差,所以我不会用它。

a = a < total ? a + 1 : 0;

答案 3 :(得分:1)

根据您想要循环的内容,可以使用不同的衬垫

current = min + (delta = (delta + step) % (max - min));

以下是使用中的示例

function count(max, min, step) {
    if (typeof min !== 'number') min = 0;
    if (typeof step!== 'number') step = 1;
    var delta = -step;
    max = max - min;

    return function next() {
        return min + (delta = (delta + step) % max);
    };
}

var fn = count(4, 1, 1);
fn(); // 1
fn(); // 2
fn(); // 3
fn(); // 1
fn(); // 2
fn(); // 3

同样,如果您通过使用

知道步数(i),您可以进行任何迭代
current = min + ((step * i) % (max - min));