多维数组行为异常

时间:2018-07-23 00:27:58

标签: javascript arrays multidimensional-array

我在使用嵌套数组时遇到了这个问题;如果我更改一个数组元素的值,则另一个数组也会更改。我不确定这是Bug还是JS中预期的问题。

如果运行此代码,您将获得两个控制台日志,其中两个数组的第一个元素为“ Changed Value”。我希望在第一个数组中看到“新值”,在valuesContainer_2数组中看到“更改后的值”。

    function validationProcess() {

    let valuesContainer_1 = [];
    let valuesContainer_2 = [];

    let data = [
        ["Option 1"],
        ["Option 2"],
    ]

    for (let i = 0; i < data.length; i++) {
        valuesContainer_1.push(data[i]);
        valuesContainer_2.push(data[i]);
    }

    valuesContainer_1[0][0] = "New Value";
    console.log(valuesContainer_1);

    valuesContainer_2[0][0] = "Changed Value";
    console.log(valuesContainer_2);
}

    validationProcess();

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果希望它们成为独立的数组,则可以将副本推入对象中。 slice()是执行此操作的一种方法。但是请注意,这是一个浅表副本,如果这些数组包含其他数组,则这些数组仍将只是对原始数组的引用。

function validationProcess() {

    let valuesContainer_1 = [];
    let valuesContainer_2 = [];

    let data = [
        ["Option 1"],
        ["Option 2"],
    ]

    for (let i = 0; i < data.length; i++) {
        valuesContainer_1.push(data[i].slice()); //<-- add a copy
        valuesContainer_2.push(data[i].slice()); //<-- add a copy
    }

    valuesContainer_1[0][0] = "New Value";
    valuesContainer_2[0][0] = "Changed Value";

    console.log(valuesContainer_1);
    console.log(valuesContainer_2)
}

    validationProcess();