Javascript 使用扩展操作符深度合并对象

Javascript 使用扩展操作符深度合并对象,javascript,recursion,ecmascript-6,Javascript,Recursion,Ecmascript 6,我可以像这样合并多个对象: var a = {k:{i:1, j:2}, m:6} var b = {k:{i:3, l:4}} var c = { ...a, ...b } c有m:6这是好的;但是,c不包含k.j:2。那是因为…b进行了浅覆盖 我想递归地使用…,这样就不会重写b中没有的嵌套属性 我喜欢…,因为它既快又干净。我可以在c的对象初始值设定项中这样做吗 更新 到目前为止我已经接近了,但似乎有点冗长: var merge = (a,b) =>

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

  var a = {k:{i:1, j:2}, m:6}
  var b = {k:{i:3, l:4}}
  var c = {
    ...a,
    ...b
  }
c
m: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)

使用
,这是不可能的。如果你事先知道物体的形状,你可以写:

vara={k:{i:1,j:2},m:6}
var b={k:{i:3,l:4}
变量c={
A.
B
k:{…a.k,…b.k},
}

否则,您需要编写一个函数来执行此操作或搜索一个函数:

这似乎是一个很好的
reduce
场景。。。你需要担心函数还是字符串/数字?另外,您是否希望以内联方式执行此操作,或者一个专用函数就足够了?@Dom,没有函数。只有对象和数据。我已经创建了
var m=(a,b)=>({…a,…Object.keys(b).reduce((acc,p)=>{acc[p]=typeof b[p]=='Object'?m(a[p],b[p]):b[p];return acc;},{}}}})
,这样我就可以
c=m(a,b)
,这是有效的,但我正试图通过使它更内联来缩短它。似乎
{…}
可以取代
减少
,但我正在尝试了解如何:)