javascript - 如何通过我的数组执行此 "weird"循环?

标签 javascript arrays

我需要以一种“奇怪”的方式遍历一个简单的数组。

我的数组的长度总是奇数的平方。

假设长度是49。为了更清楚,我的元素是数组的索引。所以我有类似的东西:

myArray = [0, 1, 2, 3, 4 ... 47, 48]

所以,你可以想象下面的方阵:

0   7   14  21  28  35  42
1   8   15  22  29  36  43
2   9   16  23  30  37  44
3   10  17  24  31  38  45
4   11  18  25  32  39  46
5   12  19  26  33  40  47
6   13  20  27  34  41  48

我必须从这个矩阵的中心开始(即 myArray[Math.floor(myArray.length/2)])

在我的示例中:24

然后我必须在左右数字之间交替,直到我通过所有行。

在我的示例中,对于第一次迭代:17, 31, 10, 38, 3, 45

完成一行后,我在上下数字之间交替,并为给定行重复左/右逻辑。

在我的示例中,对于 myArray 作为输入,我应该按以下顺序循环:

24, 17, 31, 10, 38, 3, 45, 
23, 16, 30, 9, 37, 2, 44,
25, 18, 32, 11, 39, 4, 46,
22, 15, 29, 8, 36, 1, 43,
26, 19, 33, 12, 40, 5, 47,
21, 14, 28, 7, 35, 42, 0,
27, 20, 34, 13, 41, 6, 48

你能帮我正确地实现它吗?

这是我到目前为止所做的:https://jsfiddle.net/6qzkk2zx/

最佳答案

我建议嵌套两个 ES6 生成器:

for (let y of outwards(7)) {
    for (let x of outwards(7)) {
        var i = y*7+x;
        use(arr[i]); // for one-dimensional array
        use(arr[x][y]) // for two-dimensional array
    }
}

function* outwards(n) {
    console.assert(n%2 == 1);
    var x = (n-1)/2; // starting in the middle
    yield x;
    for (var i=1; i<n;) {
        x -= i++; // jumping to the left
        yield x;
        x += i++; // and right
        yield x;
    }
}

从那开始,您可以手动将其转换回等效的 ES5 结构,或者让转译器为您完成工作:Demo .

关于javascript - 如何通过我的数组执行此 "weird"循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35203021/

相关文章:

javascript - Node - 跨平台编译 - PKG

javascript - 如何只打开一个弹窗?

javascript - 在 React 中获取数据

python - 在感知器学习模型的 Python 实现中将数组传递给 numpy.dot()

java - java中如何比较数组的特定元素

arrays - 通过补充位掩码确定最大和数组的算法

javascript - Firebase 数组转换为 AngularChart

javascript - 离开屏幕弹出窗口,带有华丽的弹出窗口传递数据效果

arrays - 插入数组值

Java 2D 数组 - 输入值