我将首先对我可怜的英语道歉。我会努力尽可能清楚。 :)
我有一个三维数组(只是一个二维数组的数组)。我的目标是采用其中一个二维阵列,逆时针旋转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);
,但它没有任何差异。
我该如何解决?谢谢你们。 :)
答案 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循环中。