Клонировать часть объекта javascript

#javascript

#javascript

Вопрос:

У меня есть большой JS-объект со множеством вложенных объектов. Например:

 var A = {
    'b': {
        c: [1],
        d: {
            e: {
                f: 'g'
            }
        }
    }
};
  

Мне нужно создать объект «B», похожий на объект «A», но массив «b.c» должен содержать еще один элемент:

 var B = {
    'b': {
        c: [1, 2],
        d: {
            e: {
                f: 'g'
            }
        }
    }
};
  

Объект «A» не должен быть изменен.

Я знаю два способа сделать это:

1 Глубокое клонирование объекта JS:

 var B = JSON.parse(JSON.stringify(A)); // or with lodash: _.cloneDeep(A)
B.b.c.push(2);
  

2 Клонировать только те объекты и массивы, которые мне нужно клонировать:

 var B = Object.assign({}, A);
B.b = Object.assign({}, B.b);
B.b.c = B.b.c.slice(0);
B.b.c.push(2);
  

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

Как создать объект «B» наиболее оптимальным способом?

Ответ №1:

JSON.stringify / .parse , безусловно, самый простой способ глубокого клонирования (простого) объекта, но, как вы сказали, он включает сериализацию и синтаксический анализ объектов, и это совершенно не самый эффективный способ.

К счастью, с ES6 все стало лучше. И с помощью ESnext вы также можете распространять объекты:

 var B = { ...A };
  

Конечно, у вас все еще есть проблема b.c , но это нужно отрегулировать вручную:

 var B = { ...A, b: { ...A.b, c: [1, 2] }};
  

Вот плагин Babel для оператора распространения объекта: https://babeljs.io/docs/plugins/transform-object-rest-spread /