Проблема с клонированием массива через [...] или slice (0) - PullRequest
0 голосов

Может ли кто-нибудь объяснить, что случилось с массивом, когда я его клонировал, бросил [...] или .spit (0)

Я пробовал это на консоли, я думаю, этого достаточно.

const a = [{cid: 1, c: []}];
const b = [...a];
for (var i = 0; i < b.length; i++) {
  b[i].f = 1;                 
}

Я клонировал «a» в «b» и сделал цикл «b» и изменил «b», но изменил «a» и «b»?КАК ПОЛУЧИТЬ?

Но если я использую .pop или .shift на 'b', меняются только 'b'

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Это создает только поверхностную копию, поэтому вы скопировали только ссылку на объект. Вы должны создать глубокую копию, которая также копирует все внутри объекта. Вы можете сделать это, используя lodash (https://lodash.com/docs/#cloneDeep), например:

var _ = require("lodash");
...
const a = [{cid: 1, c: []}];
const b = _.cloneDeep(a);
for (var i = 0; i < b.length; i++) {
  b[i].f = 1;                 
}
1 голос
/ 02 июля 2019

Проблема : это происходит потому, что внутри вашего массива у вас есть объект.И вы не сделали копию объекта.Вместо этого вы скопировали ссылку на объект.

Решения :

  • Если вы хотите скопировать массив объектов с однимВложение уровня , вы можете сделать что-то вроде этого:

    const arr2 = arr1.map(obj => ({...obj}));

  • Но если вы хотите , скопируйте массив сложных объектов с несколькими вложенными уровнями или массивами с другими объектами и т. д. вам нужно будет сделать глубокую копию каждого объекта .Для этого вы можете использовать что-то вроде метод lodash _.cloneDeep (значение) или другой инструмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...