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)
,这是有效的,但我正试图通过使它更内联来缩短它。似乎{…}
可以取代减少
,但我正在尝试了解如何:)