#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 /