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

标签 javascript arrays

首先我要为我糟糕的英语道歉。我会尽量说清楚。 :)

我有一个 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/

相关文章:

javascript - 使用正则表达式选择括号内的内容

c - 写入 char 数组,输出为空

arrays - 使用sqlite数据库将字符串转换为json数组

php 将发布数据更改为变量

javascript - View 中组件的不同大小取决于操作系统或目标

jquery - 我无法理解 jQuery 链接是如何工作的

javascript - 正则表达式查找 url 是否有文件名尾部

c - memcpy 将数组对象复制到 C 中的字符指针,反之亦然

c - C中带指针的字符串数组

javascript - 按钮需要点击两次才能触发功能