gpt4 book ai didi

javascript - 在 Javascript 中,如何有条件地更新对象的属性?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:30:02 25 4
gpt4 key购买 nike

我看过 this post并且想知道是否有一种方法可以使用 javascript 编写一个函数,该函数可以通过使用具有新值的另一个对象有条件地更新一个对象的所有属性?

假设我有这个对象:

let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };

我想使用另一个对象传递的属性来更新它的值,如下所示:

let newObj = {test2: 'newValue2'}

在这种情况下,我只想更新属性“test2”。如果我知道要更新的属性并且事先知道原始属性,我将使用:

oldObj = {
...(newObj.test1) && {test1: newObj.test1} || {test1: oldObj.test1},
...(newObj.test2) && {test2: newObj.test2} || {test2: oldObj.test2},
...(newObj.test3) && {test3: newObj.test3} || {test3: oldObj.test3},
};

这意味着我只会在属性出现在新对象中时更新值,但当然我必须添加与对象中的属性一样多的条件。

这种方法很好,但它不是通用的,所以如果对象有 10 个属性,我将不得不写 10 个条件。

有没有一种方法可以编写一个可以有条件地更新属性的函数,这样我就不必编写 10 个(或更多)个条件?

最佳答案

在您的评论中:

I will only update properties that exist in the old object, new properties that don't exist in the old object will not be added.

这意味着我们必须将扩展语法和 Object.assign 排除在外,因为它们都会从 newObj 复制所有 属性> 转到 oldObj

相反,我们可以使用一个简单的循环(如果这种情况经常出现,您可以创建一个函数,也许是 updateObject):

for (const key of Object.keys(newObj)) {
if (key in oldObj) {
oldObj[key] = newObj[key];
}
}

let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };
let newObj = {test2: 'newValue2', xyz: "don't copy me"};

for (const key of Object.keys(newObj)) {
if (key in oldObj) {
oldObj[key] = newObj[key];
}
}
console.log(oldObj);

(根据您的更新规则,您可能更喜欢 oldObj.hasOwnProperty(key) 而不是 key in oldObj。)

或者使用相对较新的 Object.entries 和一些解构:

for (const [key, value] of Object.entries(newObj)) {
if (key in oldObj) {
oldObj[key] = value;
}
}

let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };
let newObj = {test2: 'newValue2', xyz: "don't copy me"};

for (const [key, value] of Object.entries(newObj)) {
if (key in oldObj) {
oldObj[key] = value;
}
}
console.log(oldObj);


在上面引用的澄清之前,我发布了以下关于传播和 Object.assign 的内容。只是为了完整性,但它们不适用于您想要跳过 oldObj 没有的属性的情况:

你不必像传播语法那样复杂,只需:

oldObj = {...oldObj, ...newObj};

let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };
let newObj = {test2: 'newValue2', xyz: "I get copied too"};

oldObj = {...oldObj, ...newObj};
console.log(oldObj);

这将创建一个具有所有 oldObjnewObj 属性的新对象,如果两者都具有,则 newObj 的属性获胜有相同的名字。

请注意,属性(property)差价是全新的,刚刚批准进入第 4 阶段(将在 ES2018 规范中)。如果您不想使用第 4 阶段提案,请使用 Object.assign:

oldObj = Object.assign({}, oldObj, newObj);

let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };
let newObj = {test2: 'newValue2', xyz: "I get copied too"};

oldObj = Object.assign({}, oldObj, newObj);
console.log(oldObj);

如果您想就地更新 oldObj 而不是创建新对象,您也可以使用 Object.assign:

Object.assign(oldObj, newObj);

let oldObj = {test1: 'valueTest1',test2: 'valueTest2',test3: 'valueTest3' };
let newObj = {test2: 'newValue2', xyz: "I get copied too"};

Object.assign(oldObj, newObj);
console.log(oldObj);


关于javascript - 在 Javascript 中,如何有条件地更新对象的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48748985/

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