gpt4 book ai didi

javascript - 从另一个对象创建新的且不同的对象的最佳方法

转载 作者:行者123 更新时间:2023-12-03 00:08:04 24 4
gpt4 key购买 nike

我希望能够接收一个物体

const objectOriginal = {
nestedObject: {
someValue: 1
}
}

从上面创建一个新对象并将其值更改为

const newObject = {
nestedObject: {
someValue: 33
}
}

我有一个大的嵌套对象作为我的原始对象,我想基于这个原始对象创建一个新对象。问题是我需要这两个对象是不同的,而不是来自同一个原型(prototype)链。

为了解决这个问题,我创建了一个函数,它将第一个对象转换为数组,过滤出我需要更改的对象,更改值,推送到数组,然后创建一个新对象。

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
}

这个解决方案可行,但我觉得必须有更好的方法来实现这一目标?如果我想创建一个新的不同对象,我不应该(至少我不希望)将其更改为数组只是为了将其更改回对象。任何建议将不胜感激。

最佳答案

我将使用 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] 类型对的数组,以创建具有多个更改的新对象:

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

关于javascript - 从另一个对象创建新的且不同的对象的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54873943/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com