从另一个对象创建新的和不同的对象的最佳方法
Best way to create a NEW and DIFFERENT Object from another object
我想收一个物体
const objectOriginal = {
nestedObject: {
someValue: 1
}
}
从上面创建一个新对象并将其值更改为
const newObject = {
nestedObject: {
someValue: 33
}
}
我有一个很大的嵌套对象对象作为我的原始对象,我想在这个原始对象的基础上创建一个新对象。问题是我需要这两个对象不同,而不是来自同一个原型链。
为了解决这个问题,我创建了一个函数,将第一个对象转换为数组,过滤掉我需要更改的对象,更改值,推送到数组,然后创建一个新对象.
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
}
这个解决方案可行,但我觉得一定有更好的方法来实现这一点?如果我想创建一个新的和不同的对象,我不应该(至少我希望不会)将它更改为数组只是为了将它更改回对象。任何建议将不胜感激。
你的问题是两个变量都指向同一个对象(浅拷贝)。您正在做的是深拷贝,有一种更简单的方法是使用 JSON:
function jsonCopy(src) {
return JSON.parse(JSON.stringify(src));
}
将您的原始对象作为 src 传递,它会将其转换为 JSON 字符串并将其解析回对象,执行对象的深层复制并返回它。
我会用Object.assign() for this. We create a new empty object, assign all the original properties of the original object and then assign the new nested object. The method will take care of replace existing properties by the new ones (Read more here: 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]]
));
我想收一个物体
const objectOriginal = {
nestedObject: {
someValue: 1
}
}
从上面创建一个新对象并将其值更改为
const newObject = {
nestedObject: {
someValue: 33
}
}
我有一个很大的嵌套对象对象作为我的原始对象,我想在这个原始对象的基础上创建一个新对象。问题是我需要这两个对象不同,而不是来自同一个原型链。
为了解决这个问题,我创建了一个函数,将第一个对象转换为数组,过滤掉我需要更改的对象,更改值,推送到数组,然后创建一个新对象.
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
}
这个解决方案可行,但我觉得一定有更好的方法来实现这一点?如果我想创建一个新的和不同的对象,我不应该(至少我希望不会)将它更改为数组只是为了将它更改回对象。任何建议将不胜感激。
你的问题是两个变量都指向同一个对象(浅拷贝)。您正在做的是深拷贝,有一种更简单的方法是使用 JSON:
function jsonCopy(src) {
return JSON.parse(JSON.stringify(src));
}
将您的原始对象作为 src 传递,它会将其转换为 JSON 字符串并将其解析回对象,执行对象的深层复制并返回它。
我会用Object.assign() for this. We create a new empty object, assign all the original properties of the original object and then assign the new nested object. The method will take care of replace existing properties by the new ones (Read more here: 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]]
));