我试图记住一些名为"发条算术"在我很久以前在关于幻灯片/旋转木马的教程中读过的Javascript中。 (术语可能有误,因为我无法在谷歌找到任何有用的东西)
这是以下代码的简写:
a = a + 1;
if (a > total) a = 0;
基本上它是递增直到它达到总数,当它达到总数时它将重置回0.这主要用于创建轮流,它将无限滚动,因为它总是滚动回到开头(索引0)
有没有人如何使用上述发条算法在1行中编写上述2行代码?我认为它使用了"余数" operator%但我不记得其他的东西。
答案 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));