首先我要为我糟糕的英语道歉。我会尽量说清楚。 :)
我有一个 3 维数组(只是一个二维数组的数组)。我的目标是采用其中一个二维数组,并将其逆时针旋转 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);
但它没有产生任何差异.
我该如何解决?谢谢你们。 :)
最佳答案
直接给数组赋值,在javascript中是引用赋值。这意味着任何更改都将反射(reflect)在两者中。要复制数组,您需要调用 array.slice()。
注意:这仍然是对多维数组的赋值,因此您需要编写一些递归的东西来复制一个多维数组(在任何元素上,例如 [1, 2, ['some ', '内部', '数组'], 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;
}
关于javascript - 创建数组的副本并操作原始数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25408799/