2016-10-09 3 views
0

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

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

Мне нужно создать объект «B» выглядит как объект «А», но массив «Ьс» должен содержать еще один пункт:

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 Clone только те объекты и массивы, которые мне нужно клонировать:

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] }}; 

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

Смежные вопросы