繁体   English   中英

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

[英]In Javascript, how to conditionally update a property of an object?

我已经看过这篇文章 ,并想知道是否有一种方法可以使用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个(或更多)条件?

你在评论中说过:

我将只更新旧对象中存在的属性,不会添加旧对象中不存在的新属性。

这意味着我们必须将spread语法和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 oldObjkey 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); 


在上面引用的澄清之前,我发布了以下关于spread和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的属性将获胜。

请注意,物业价差是全新的 ,只是批准到第4阶段(将在ES2018规范中)。 如果您不想使用Stage 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); 


暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM