const Arr = [0, 1, 2];
for (var i = Number.MIN_SAFE_INTEGER; i <= Number.MAX_SAFE_INTEGER; i += 1) { ... }
需要将任何给定的 i 与 Arr 中的相应索引相关联,以便
i=-3 => 0
i=-2 => 1
i=-1 => 2
i=0 => 0
i=1 => 1
i=2 => 2
i=3 => 0
i=4 => 1
i=5 => 2
......等等。
答案 0 :(得分:1)
这个问题不需要数组因子。它是关于将任何整数映射到有限范围。
您可以使用以下转换:
j = i - Math.floor(i/3)*3
注意:对于正数,您只能使用i % 3
,但它不会给出您想要的负数结果。
答案 1 :(得分:1)
我可能会建议创建一个index
函数,它接受一个数组xs
和一个索引i
。从概念上讲,我们想要做的是 wrap i
,如果它在任一方向上超出xs
的界限。 remainder (%) operator正是我们工作所需要的
const index = (xs, i) =>
i < 0
? xs [0 - (i % xs.length)]
: xs [i % xs.length]
const data =
[ 'a', 'b', 'c' ]
for (let i = -5; i < 6; i++)
console.log (i, index (data, i))
// -5 'c'
// -4 'b'
// -3 'a'
// -2 'c'
// -1 'b'
// 0 'a'
// 1 'b'
// 2 'c'
// 3 'a'
// 4 'b'
// 5 'c'
&#13;
答案 2 :(得分:0)
我找到了一个很好的解决方案:
function mod(n, m) {
const q = n % m;
return q < 0 ? q + m : q;
}