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