Я буду использовать Object.assign () для этого.Мы создаем новый пустой объект, назначаем все исходные свойства исходного объекта, а затем назначаем новый вложенный объект.Метод позаботится о замене существующих свойств новыми (Подробнее здесь: Объединение объектов с одинаковыми свойствами ).
const originalObject = {
nested1: {id: "nested1", value: 1},
nested2: {id: "nested2", value: 2},
nested3: {id: "nested3", value: 3}
};
const createNewObject = (originalObj, valToChange, newVal) =>
{
const newObj = {id: valToChange, value: newVal};
return Object.assign({}, originalObj, {[valToChange]: newObj});
};
// Example of replacements.
console.log(createNewObject(originalObject, "nested1", 33));
console.log(createNewObject(originalObject, "nested2", 99));
// Example of a new property (none of the original are replaced)
console.log(createNewObject(originalObject, "nested4", 44));
Вы можете даже обобщить предыдущий метод, чтобы принять массив пар типа [valToChange, newVal]
, чтобы создать новый object
с несколькими изменениями:
const originalObject = {
nested1: {id: "nested1", value: 1},
nested2: {id: "nested2", value: 2},
nested3: {id: "nested3", value: 3}
};
const createNewObject = (originalObj, updateList) =>
{
let newObjs = updateList.reduce((acc, [k, v]) =>
{
acc[k] = {id: k, value: v};
return acc;
}, {});
return Object.assign({}, originalObj, newObjs);
};
console.log(createNewObject(
originalObject,
[["nested1", 33], ["nested2", 99], ["nested4", 44]]
));