【问题标题】:JS Recursive object assign [duplicate]JS递归对象分配[重复]
【发布时间】:2018-09-18 11:44:53
【问题描述】:

我了解到,当使用 Object.assign() 时,它只扩展顶级对象。如何深入扩展对象?例如,假设我有以下源对象:

const source = {
  id: 1,
  otherKey: {},
  params: {
    page: {
      a: 1,
      b: {}
    },
    data: {
      b: 1
    }
  }
}

我正在像这样使用Object.assign()

Object.assign({}, source, {
  params: {
    page: {
      a: 2
    }
  }
}

结果将是:

{
      id: 1,
      otherKey: {},
      params: {
        page: {
          a: 2
        }
      }
}

如何以浅克隆方式保留 params.data 键和 params.page.b 键。

oldObject.params.data === newObject.params.data  // true
oldObject.params.page === newObject.params.page  // false
oldObject.params.page.b === newObject.params.page.b // true

注意:这个问题与How to deep merge instead of shallow merge不同。那里的答案没有给出预期的结果。

检查这个bin,它从上面的链接中得到答案。

【问题讨论】:

  • "注意:这个问题与How to deep merge而不是shallow merge不同。那里的答案没有给出预期的结果。" 它看起来完全像一个复制。具体是什么(例如)this answer 没有按您的预期工作?示例:jsfiddle.net/9oczv2a0
  • @T.J.Crowder 给我几分钟时间给你看。
  • 您能否指出oldObject.params === newObject.paramsoldObject === newObject 的预期结果?
  • oldObject.params === newObject.params // 假 oldObject === newObject // 假
  • 所以你想要在源和目标之间使用相同的、预先存在的 params 对象的东西。这可能不是一个好主意,但如果这是您想要做的,那么修改那里的代码肯定很简单吗?你被困在哪里了?

标签: javascript javascript-objects shallow-copy shallow-clone


【解决方案1】:

因此,在您发布的代码中,如果源代码和目标代码都包含相同的密钥,则不会发生任何事情。该对象被递归到孩子。但是,如果您只是将内部块更改为:

if (!target[key]) { 
  Object.assign(target, { [key]: {} });
}else{          
  target[key] = Object.assign({}, target[key])
}
mergeDeep(target[key], source[key]);

这将为在源和目标中找到的任何键创建一个新的分配对象。有趣的是,如果您这样做,您预期的falseys 将不会出现在控制台中。这是因为目标将始终匹配结果,因为它是最终的变异对象。因此,为了获得您预期的false 结果,您需要执行以下操作:

var tester = source.params
const result = mergeDeep(source, b)
console.log(tester === result.params) // this will be false after the above addition

你可以在这里看到你想要的结果:http://jsbin.com/vicemiqiqu/1/edit?js,console

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 2018-10-27
    • 1970-01-01
    • 2020-02-21
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多