我希望能够带入一个物体
const objectOriginal = {
nestedObject: {
someValue: 1
}
}
从上面创建一个新对象,并将其值更改为
const newObject = {
nestedObject: {
someValue: 33
}
}
我有一个很大的嵌套对象作为原始对象,并且我想基于该原始对象创建一个新对象。问题是我需要这两个对象是不同的,而不是来自同一原型链。
为了解决此问题,我创建了一个函数,该函数将第一个对象转换为数组,滤除需要更改的对象,更改值,推送到数组,然后创建一个新对象。 / p>
const originalObject = {
nested1: {
id: "nested1"
value: 1
},
nested2: {
id: "nested2"
value: 2
},
nested3: {
id: "nested3"
value: 3
}
}
const valueToChange = "nested1"
const createNewObject = (originalObject, valueToChange) => {
const originalObjectToArray = Object.values(originalObject)
const temporaryArray = originalObjectToArray.filter(object => object.id !== valueToChange)
const newNestedObject = {
id: valueToChange,
value: 33
}
temporaryArray.push(newNestedObject)
const newAndDifferentObject = {}
for (let obj of temporaryArray) {
newAndDifferentObject[obj.id] = obj
}
return newAndDifferentObject
}
此解决方案有效,但我认为必须有更好的方法来实现这一目标?如果要创建一个新的不同对象,则不应(至少希望不要)将其更改为数组,而只是将其更改回一个对象。任何建议将不胜感激。
答案 0 :(得分:1)
我将为此使用 Object.assign() 。我们创建一个新的空对象,分配原始对象的所有原始属性,然后分配新的嵌套对象。该方法将负责用新属性替换现有属性(在此处了解更多:Merging Objects With Same Properties)。
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]]
));
答案 1 :(得分:0)
您的问题是两个变量都指向同一对象(浅表副本)。您正在做的是一个深层副本,还有一种更简单的方法是使用JSON:
function jsonCopy(src) {
return JSON.parse(JSON.stringify(src));
}
将原始对象作为src传递,它将把它转换为JSON字符串,然后将其解析回一个对象,对对象执行深层复制并返回它。