创建数组的副本并操作原始数据

时间:2014-08-20 15:32:17

标签: javascript arrays

我将首先对我可怜的英语道歉。我会努力尽可能清楚。 :)

我有一个三维数组(只是一个二维数组的数组)。我的目标是采用其中一个二维阵列,逆时针旋转90°。它看起来像这样:

[1|2|3]  
[4|5|6]
[7|8|9]  

我试着让它像这样“旋转”:

[3|6|9]  
[2|5|8]  
[1|4|7]

我想更改原始数组,所以我想我需要创建它的副本,所以我将有一个参考工作。所以,这就是我所做的:

var temp = [];
var cube =  [
    [
        ['A', 'A', 'A'],
        ['A', 'A', 'A'],
        ['A', 'A', 'A']
    ], [
        ['B', 'B', 'B'],
        ['B', 'B', 'B'],
        ['B', 'B', 'B']
    ], [
        ['C', 'C', 'C'],
        ['C', 'C', 'C'],
        ['C', 'C', 'C']
    ], [
        ['D', 'D', 'D'],
        ['D', 'D', 'D'],
        ['D', 'D', 'D']
    ], [
        ['1', '2', '3'],
        ['4', '5', '6'],
        ['7', '8', '9']
    ], [
        ['F', 'F', 'F'],
        ['F', 'F', 'F'],
        ['F', 'F', 'F']
    ]
];

function CCW() {
    temp = temp.concat(cube[4]);
    for(var i = 0; i < 3; i++)
        for(var j = 0; j < 3; j++)
            cube[4][i][j] =  temp[j][2-i];
}

CCW();

原始数组的副本应位于temp

现在,问题在于这一行:cube[4][i][j] = temp[j][2-i];。它不会仅更改cube中数组的值,而是更改temp的值。我尝试将temp = temp.concat(cube[4]);更改为temp = cube[4].slice(0);,但它没有任何差异。

我该如何解决?谢谢你们。 :)

2 个答案:

答案 0 :(得分:1)

直接分配数组时,它是javascript中的引用赋值。这意味着任何更改都将反映在两者中。要复制数组,您需要调用array.slice()。

注意:这仍然是多维数组的赋值,所以你需要写一些递归的东西来复制一个具有多个维度的数组(在任何元素上,例如[1,2,['some ',''inner','array'],3])

这样清楚吗?

编辑:这是一个deepCopyArray函数,这需要为任意对象扩展,但是......

function deepCopyArray(arr) {
    var newArr = [];
    for (var i = 0; i < arr.length; i++)
    {
        var a = arr[i], ele;
        if (a instanceof Array) //current element is an array...
            ele = deepCopyArray(a);
        else 
            ele = a;
        newArr.push(ele);
    }
    return newArr;
}

答案 1 :(得分:0)

var temp = cube.slice()

应该做的就是把它放在每一行的for循环中。