Синтаксис для глубокого копирования массива с помощью оператора распространения - PullRequest
0 голосов
/ 06 февраля 2020

Мне известно о глубоком копировании объекта и массива следующими способами:

С объектами: Way1: JSON way

const obj1 = {
        id: 5,
        names: {
            first: 'tinu',
            last: {
                other: 'k'
            }
        }
    };
    
    //Deep copy way 1: JSON way
    const obj2  = JSON.parse(JSON.stringify(obj1));
    
    // Modify the nested 2nd object
    obj2.names.last.other = 'f';
    
    console.log(obj1); // Prints { id: 5, names: { first: 'tinu', last: { other: 'k' } } }
    console.log(obj2); // Prints { id: 5, names: { first: 'tinu', last: { other: 'f' } } }

С объектами: Way2: Синтаксический путь распространения

const obj1 = {
    id: 5,
    names: {
        first: 'tinu',
        last: {
            other: 'k'
        }
    }
};

//Deep copy way 2: Spread syntax way
const obj2 = {...obj1, names: {...obj1.names, last: {...obj1.names.last}}};

// Modify the nested 2nd object
obj2.names.last.other = 'f';

console.log(obj1); // Prints { id: 5, names: { first: 'tinu', last: { other: 'k' } } }
console.log(obj2); // Prints { id: 5, names: { first: 'tinu', last: { other: 'f' } } }

С массивами: Way1: JSON way

  const array1 = [['a'], 'b', 'c'];
    
    // Deep copy way 1: JSON way
    const array2  = JSON.parse(JSON.stringify(array1));
    
    //Modify the nested 2nd array
    array2[0].push('pushed');
    
    console.log(array1);
    console.log(array2);

Что такое синтаксический способ распространения с массивами для глубокого копирования?

1 Ответ

1 голос
/ 06 февраля 2020

Для каждого вложенного массива замените его на [...originalArrayReference]. Если вам необходимо заменить определенные признаки, сначала разделите внешний массив до и после этого индекса:

const array1 = [['a'], 'b', 'c'];
    
const array2  = [[...array1[0]], ...array1.slice(1)];

//Modify the nested 2nd array
array2[0].push('pushed');

console.log(array1);
console.log(array2);

Для более сложного примера:

const origArr = [
  [
    'foo',
    'bar'
  ],
  [
    'bar',
    'baz',
    ['nested1', 'nested2', 'nested3'],
    'baz',
    'buzz'
  ],
  'buzz'
];

const newArr = [
  [...origArr[0]],
  [
    ...origArr[1].slice(0, 2),
    [...origArr[1][2]],
    ...origArr[1].slice(0, 3)
  ],
  origArr[2]
];
console.log(newArr);
 
...