首页 > 解决方案 > 使用扩展运算符深度合并对象

问题描述

我可以像这样合并多个对象:

  var a = {k:{i:1, j:2}, m:6}
  var b = {k:{i:3, l:4}}
  var c = {
    ...a,
    ...b
  }

cm:6哪个好;但是, c 不包含k.j:2. 那是因为...b做了浅覆盖。

我想...递归地使用,这样不在的嵌套属性b就不会被覆盖。

我喜欢...它,因为它看起来又快又干净。我可以在c的对象初始化程序中这样做吗?


更新

到目前为止我已经接近了,但它似乎有点冗长:

  var merge = (a,b) => Object.assign(a, ...Object.keys(b).map(k => ({[k]: typeof b[k] === 'object' ? merge(a[k], b[k]) : b[k]})))
  var a = {k:{i:1, j:2}, m:6}
  var b = {k:{i:3, l:4}}
  var c = merge(a,b)

标签: javascriptrecursionecmascript-6

解决方案


这是不可能的...。如果您事先知道对象的形状,尽管您可以这样写:

  var a = {k:{i:1, j:2}, m:6}
  var b = {k:{i:3, l:4}}
  var c = {
    ...a,
    ...b,
    k: { ...a.k, ...b.k },
  }

否则,您需要编写一个函数来执行此操作或搜索一个:https ://www.npmjs.com/search?q=merge+deep


推荐阅读