更新嵌套的JS对象,而不会覆盖缺少的属性

Cold_Class

编辑:谢谢4个伟大的,多样化的答案-即使我意识到我需要更多的要求之后,我还是选择了对我有用的解决方案:我还需要添加新的属性,并使其与对象中的数组一起使用。

我想做的是:通过另一个对象更新一个对象。
以下是一些限制条件:

  • 仅应更新新对象具有的属性(原始对象也应具有的属性),其他属性应保持不变,而不是删除
  • 嵌套对象也应以相同方式更新

我的问题是我不知道如何轻松地对嵌套对象执行此操作,因为typeof x === "object"例如对于Date对象也返回true。

这是到目前为止我得到的:

let originalObj = {
  dateCreated: new Date(2021, 1, 10),
  value: "100",
  subObj: {
    count: 55,
    val: null
  }
};

let updateObj = {
  dateCreated: new Date(2021, 1, 11),
  subObj: {
    val: 90
  }
};

let updateOrignal = (oObj, uObj) => {
  for (let prop in uObj) {
    if (uObj.hasOwnProperty(prop) &&
      oObj.hasOwnProperty(prop)) {
      oObj[prop] = uObj[prop];
    }
  }
};

console.log(originalObj);
updateOrignal(originalObj, updateObj)
console.log(originalObj);

目前,我的更新对象如下所示:

{
  "dateCreated": "2021-02-10T23:00:00.000Z",
  "value": "100",
  "subObj": {
    "val": 90
  }
}

我的目标:

{
  "dateCreated": "2021-02-10T23:00:00.000Z",
  "value": "100",
  "subObj": {
    "count": 55,
    "val": 90
  }
}
弗朗切斯科·奥尔西(Francesco Orsi)

这是您需要的解决方案(来自https://gist.github.com/ahtcx/0cd94e62691f539160b32ecda18af3d6),实际上您可以在Google上搜索“深度合并”或“递归合并两个javascript对象”

我添加了ES6 sintax {... obj},以确保在合并对象之前先克隆它们

let originalObj = {
  dateCreated: new Date(2021, 1, 10),
  value: "100",
  subObj: {
    count: 55,
    val: null
  }
};

let updateObj = {
  dateCreated: new Date(2021, 1, 11),
  subObj: {
    val: 90
  }
};

const merge = (target, source) => {
  // Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties
  for (const key of Object.keys(source)) {
    if (source[key] instanceof Object) Object.assign(source[key], merge(target[key], source[key]))
  }
  // Join `target` and modified `source`
  Object.assign(target || {}, source)
  return target
}

console.log(merge({ ...originalObj}, {...updateObj}));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

嵌套属性不会更新rails

来自分类Dev

VueJS 嵌套组件不会更新操作属性

来自分类Dev

嵌套的ng-repeat不会更新对象

来自分类Dev

根据另一个属性的值更新嵌套对象属性-JS

来自分类Dev

更新对象时,对对象属性的绑定不会更新

来自分类Dev

Javascript / jQuery:嵌套循环,防止覆盖对象属性

来自分类Dev

Javascript / jQuery:嵌套循环,防止覆盖对象属性

来自分类Dev

Javascript / jQuery:嵌套循环,防止覆盖对象属性

来自分类Dev

嵌套对象相互覆盖

来自分类Dev

嵌套对象更新后,Redux不会重新渲染

来自分类Dev

覆盖对象属性Javascript

来自分类Dev

Javascript覆盖对象属性

来自分类Dev

当更新对象的属性时,Powershell不会保留类型转换

来自分类Dev

HTML对象标签的“数据”属性不会随着jQuery的更改而更新

来自分类Dev

双向绑定不会使用Date对象更新属性

来自分类Dev

在更新对象的属性时,Powershell不会保留类型转换

来自分类Dev

使用(ES6)计算的属性名称更新嵌套对象

来自分类Dev

AngularJS-使用$ http更新数组内的嵌套对象属性

来自分类Dev

将键传递给对象以更新嵌套的属性值

来自分类Dev

MVVM 如何在嵌套对象属性更新时获得通知?

来自分类Dev

rmagick不会覆盖EXIF属性

来自分类Dev

如何覆盖嵌套的数组对象

来自分类Dev

使用stickit.js的骨干.js嵌套对象属性

来自分类Dev

使用stickit.js的骨干.js嵌套对象属性

来自分类Dev

如果对象键位于PascalCase中,则不会触发ember中嵌套对象的属性

来自分类Dev

嵌套对象的持久属性

来自分类Dev

观察嵌套对象的属性

来自分类Dev

获取嵌套对象的属性

来自分类Dev

MVVM属性不会更新

Related 相关文章

热门标签

归档