Javascript Array Copy поврежден

У меня есть массив объектов в React State: this.state.expandableRowSwitches это массив объектов:

{дисплей: ложь, выбран: ложь, призрак: ложь}

Когда я пытаюсь сделать копию массива, чтобы манипулировать им (глубокий или неглубокий), я не получаю точную копию обратно, если следую за строкой копирования строкой, которая манипулирует определенным индексом массива. Если я прокомментирую эту строку, копия вернется к идеальному состоянию при выполнении. Единственная единственная форма копирования массива, которая этого не делает, - это JSON.parse(JSON.stringify), но я не хочу полагаться на это как на метод. Я попробовал все остальное, включая DeepClone от Lodash и даже обычный цикл. Опять же, когда я использую метод JSON.parse, моя программа выполняется как ожидалось. Любая помощь будет принята с благодарностью.

onTableRowDoubleClick(index) {
    console.log('onTableRowDoubleClick');
    let arrayCopy = [];
    arrayCopy = _.cloneDeep(this.state.expandableRowSwitches);
    //let arrayCopy = _.clone(this.state.expandableRowSwitches);
    //let arrayCopy = this.state.expandableRowSwitches.splice(0);
    //let arrayCopy = [...this.state.expandableRowSwitches];
    //let arrayCopy = this.state.expandableRowSwitches.slice(0);
    arrayCopy[index].display = !arrayCopy[index].display;
    return arrayCopy;
}`

1 ответ

Объекты в скопированном массиве ссылаются на объекты в исходном массиве. Ты можешь использовать Object.assign() установить каждый объект как новый объект, установив свойства и значения, совпадающие с исходным объектом, чтобы разорвать взаимную ссылку на объект.

let arrayCopy = this.state.expandableRowSwitches.map(o => Object.assign({}, o));

const arr = Array({a:1}, {b:2}, {c:3}); // original array

let copy = arr.slice(0); // copy of original array

arr[0].a = 5; // set `"a"` at index 0 of `arr` to `5`

console.log(copy[0].a); // `"a"` at index 0 of `copy` is also set to `5`

copy = arr.map(o => Object.assign({}, o)); // set `o` as a new object

arr[0].a = 1; // set `"a"` at index 0 of `arr` to `5`

console.log(copy[0].a); // `5`,  not set to `1` by `arr` reference

Другие вопросы по тегам