在给定偏移量大于数组的情况下,在数组上无缝循环,向前或向后循环

Loop seamlessly over an array, forwards or backwards given an offset larger than the array

本文关键字:循环 数组 情况下 偏移量 大于      更新时间:2023-09-26

这与我之前提出的问题类似(在数组中向前和向后选择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;
}

看,你不需要 for 循环或任何东西。您只需要将数字与其符号相加并取模数即可。

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

仅此而已。应使用 n 的正值或负值。

它并不完全优雅,但是如果你有一个前进的工作方法,你可以在开头放一个"if"语句,检查它是否大于0。如果不是,你可以反转所有内容,将偏移量乘以 -1,然后无论如何都要这样做!:D

好吧,

如果你有a作为你当前的索引,b作为你的目标索引(可能大于或小于长度或零)

b2 = b % (list.length - 1)

在数组中提供有效的索引。

如果你减去b2 - a = d你知道是走多少步,也是向上还是向下,取决于d是大于还是小于零

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