在每个循环迭代中将数组的3个元素移动一个

时间:2015-02-04 19:12:44

标签: javascript arrays loops recursion pop

我有一个数组[1,1,1,0],但可以是数组的任何大小,数组的最小长度和数字1是3,我想继续移动1的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,1,0,0,0]-> [0,1,1,1,0,0]-> [0,0,1,1,1,0]-> [0,0,0,1,1,1]-> and so on for ever...

代码:

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);
}

3 个答案:

答案 0 :(得分:2)

  • 首先弹出(存储它)。所以[abcd] - &gt; [abc]并存储了d。
  • 逆向。所以[abc] - &gt; [cba]。
  • 添加弹出元素。所以[cba] - &gt; [cbad]
  • 逆向。所以[cbad] - &gt; [dabc]。

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


如果它对您有所帮助,请提供支持。 :(

答案 1 :(得分:2)

根据您要执行的操作,我建议您使用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

答案 2 :(得分:1)

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/