无缝循环遍历数组,可以向前或向后移动大于数组长度的偏移量。

3

这个问题与我之前提出的问题类似(在数组中选择向前和向后X个元素,如果需要则循环到开头和结尾)。

但是我正在尝试解决另一个不同的问题时遇到了困难。

给定一个任意的数组和一个当前的索引

[a, b, c, d, e, f, g, h, i, j, k]

假设当前索引为0 (a)

现在我需要找到一个新的索引,给定一个偏移量n(假设是30,也可以是负数以倒序循环)。这样它就会遍历数组,并在到达末尾时从开头继续循环(或者在反向循环时从结尾继续循环),然后返回新的数组索引。

我已经成功地修改了一个与此类似的问题的答案来向前遍历数组,但当我尝试将其更改为向后遍历时它就不起作用了。

function crawlArrayForwards(array, index, n){
    var finalIndex;
    for (var i = index, len = array.length; i <= index + n; i++) {
        finalIndex = (i + len) % len;
    }
    return finalIndex;
}
3个回答

10

看,你不需要使用for循环或者其他什么。你只需要将数字与其符号相加并取模即可。

function crawlArray(array, index, n) {
    return ((index + n) % array.length + array.length) % array.length;
}

就是这样。应该适用于n的正值或负值。


我知道我实际上并不需要for循环,删除循环是我的目标,在它真正开始工作之后。谢谢你,我会测试一下的。 - Kayo
我注意到在向后移动时,它会有点“摇晃”,而不是跳到数组的末尾。如果这有意义的话。 - Kayo
“Swing”是什么意思? - Aioros
请原谅我,但在这个例子中,第二个日志应该返回一个正数吗?http://jsfiddle.net/5XEdh/ - Kayo
1
你说得对,我没有想到一个很大的负数 n 会使结果保持为负数。我稍微修改了函数以处理任何可能的情况。 - Aioros
显示剩余4条评论

0
如果你以a为当前索引,b为目标索引(可能比长度大或小,甚至为零),那么
b2 = b % (list.length - 1)

在数组中返回一个有效的索引。

如果你减去b2 - a = d,你就知道需要走多少步,以及是向上还是向下,取决于d是否大于或小于零。

for(var i = a; i !== b2; i += (d > 0) ? 1 : -1) {

}

有道理!我要尝试将它放入jsfiddle的函数中,然后告诉你结果。 - Kayo

0

虽然不那么优雅,但如果你有一个可行的前进方法,你可以在开始处放置一个“if”语句,检查它是否大于0。如果它不是,你可以反转一切,将偏移乘以-1,然后仍旧执行! :D


我试着做这个,但它就挂了,哈哈。也许你可以在jsfiddle上提供一个例子? - Kayo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接