【问题标题】:How to move 3 elements of array one by one in each of loop iterations?如何在每次循环迭代中一个接一个地移动数组的 3 个元素?
【发布时间】:2015-04-04 10:53:32
【问题描述】:

我有一个数组[1,1,1,0](任何大小),数组和数字 1 的最小长度是 3。我想继续向上移动 1s 1 元素的值,以便它可以移动到 [0,1,1,1],然后返回到[1,1,1,0]

我的循环在递归模式下工作,但我不确定如何重置这些值,所以在 4 次循环之后,我的整个数组都被 0 填充。

更长的数组会这样遍历:

例子:

[1,1,1,0,0,0]-> [0,1,1,1,0,0]-> [0,0,1,1,1,0]-> [0,0,0,1,1,1]-> 
[1,1,0,0,0,1]-> [1,1,1,0,0,0]-> [0,1,1,1,0,0]-> [0,0,1,1,1,0]->

永远如此……

代码:

function flip(images, active) {
    var new_active = active;

    setTimeout(function() {
        active.reverse();
        active[active.length] = 0;
        active.reverse();
        active.pop();

        for(var i = 0; i < active.length; i++) {
            alert(active[i]);
        }

        flip(images, active);
    }, 5000);
}

【问题讨论】:

  • 不太明白你想做什么。是 [1,1,1,0]->[0,1,1,1]->[1,0,1,1]->[1,1,0,1]->[1,1, 1,0] 好吗?举个例子吧。
  • 我添加了一个数组大小更大的示例。
  • 这很容易理解。也许这叫轮换,你看到3个答案了吗?

标签: javascript arrays loops recursion


【解决方案1】:

根据你想做的方向,我建议使用shift()push(),或者pop()unshift()

基本上,shift()unshift() 从数组的前面添加或删除一个元素,push()pop() 从数组的后面添加或删除一个元素。

对于您给出的示例,您可能希望将pop() 放在数组末尾,将unshift() 放在前面:

function rotateArray(arr) {
    var element = arr.pop();
    arr.unshift(element);
}
// Repeat in loop, timeout, etc. as necessary

【讨论】:

  • 啊,正是我需要的一个例子。谢谢。
  • 您还可以添加dir 参数(方向)并按如下方式实现:function rotateArray(arr, dir) { dir = !dir || dir &gt; 0; arr[dir ? "unshift" : "push"](arr[dir ? "pop" : "shift"]()); } - 请参阅此fiddle
【解决方案2】:
  • 首先弹出(存储它)。所以 [abcd]->[abc] 你已经存储了 d。
  • 反向。所以 [abc]->[cba]。
  • 添加弹出的元素。所以 [cba]->[cbad]
  • 反向。所以 [cbad]->[dabc]。

我希望你想要那个? 也见this


如果对你有帮助,请点赞。 :(

【讨论】:

  • 感谢push()/pop()unshift()/shift() 的存在,您不需要反转数组。看我的回答:stackoverflow.com/a/28329759/129655
  • 很公平。从算法的角度来看,您的想法是正确的;只是把这当作另一个学习机会。 :-)
【解决方案3】:
var arr = [1, 1, 1, 0, 0, 0],
    startIndex = arr.indexOf(1),
    sliceLength = 3,
    slice;

while(arr[arr.length - 1] === 0) {
    // slice out the 1's (modifies the original array)
    slice = arr.splice(startIndex, sliceLength);
    // splice the 1's back in, one spot over
    arr.splice.apply(arr, [++startIndex, 0].concat(slice));
    console.log(arr);
}

http://jsfiddle.net/sn7ujb90/1/

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 2023-01-14
    • 2018-12-27
    • 1970-01-01
    相关资源
    最近更新 更多