Неожиданное поведение многомерных массивов

1

У меня проблема с вложенными массивами; если я изменю значение одного элемента массива, другой массив также будет изменен. Я не уверен, что это ошибка или что-то ожидаемое в JS.

Если вы запустите этот код, вы получите два консольных журнала с массивами с первым элементом как "Измененное значение". Я ожидаю увидеть "Новое значение" в первом массиве и "Измененное значение" в массиве 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();

Спасибо вам за помощь!

  • 0
    data[i] - это объект , и объекты передаются по ссылке, они не копируются, если вы не скопировали их явно
  • 0
    Можете ли вы указать, как объекты могут быть скопированы? Нужно ли создавать новые объекты, передавать данные тут же, а затем отправлять?
Теги:
arrays
multidimensional-array

1 ответ

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();
  • 0
    Спасибо Марк! Каков будет лучший способ глубокого клонирования?
  • 0
    @Rehan Для глубокого клонирования требуется небольшая работа - для общего решения вам нужно перебрать все дочерние элементы и рекурсивно скопировать. Некоторые люди делают ярлык с JSON.parse(JSON.stringify(data[i])) но обычно вы можете сделать это лучше, если вы можете адаптировать решение к вашим данным, а не делать общее решение. На SO должно быть много ответов о глубоких копиях.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню