Javascript 拉姆达:右+;mergeAll(…可能是mergeDeepRightAll)

Javascript 拉姆达:右+;mergeAll(…可能是mergeDeepRightAll),javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,目前在拉姆达如果我想深度合并(右)多个对象我 var a = _.mergeDeepRight( { one: 1 }, { two: { three: 3 } } ) var b = _.mergeDeepRight( a, { three: { four: 4 } } ) var c = _.mergeDeepRight( b, { four: { five: 5 } } ) // c === { one:1, two: { three: 3 }, three: { four: 4 },

目前在拉姆达如果我想深度合并(右)多个对象我

var a = _.mergeDeepRight( { one: 1 }, { two: { three: 3 } } )
var b = _.mergeDeepRight( a, { three: { four: 4 } } )
var c = _.mergeDeepRight( b, { four: { five: 5 } } )

// c === { one:1, two: { three: 3 }, three: { four: 4 }, four: { five: 5 } }
如果我使用
.mergeAll
(即
.mergeAll(a,b,c)
),它返回
{1:1,2:3}}
,因为
.mergeAll
不深

有没有一种更整洁的方法来深度合并(右)多个对象?类似于

_.mergeDeepRightAll( a, b, c )

reduce
在这里可能是一个很好的调用,因为我们正在将一系列项转换为一个

如果我们将输入更改为

var a = mergeDeepRight( { one: 1 }, { two: { three: 3 } } )
var b = { three: { four: 4 } }
var c = { four: { five: 5 } }
我们能做到

const mergeDeepAll = reduce(mergeDeepRight, {})

mergeDeepAll([a, b, c])

// -> {"four": {"five": 5}, "one": 1, "three": {"four": 4}, "two": {"three": 3}}
如果您不想以数组的形式提供参数,您可以取消应用它,尽管数组更符合
R.mergeAll
的签名

const mergeDeepAll = unapply(reduce(mergeDeepRight, {}))

mergeDeepAll(a, b, c)

我要注意的是,这些示例实际上没有任何冲突的键,因此这里可以使用一个直接的
R.mergeAll
。但是,这两种输出的顺序都不完全相同。

关于输出顺序:仅保证对象属性顺序为ES 2015+。OP无论如何都应该小心依赖它。请注意,键顺序的变化主要是由于某些输出格式(例如
console.log
JSON.stringify
)是的,在es6之前没有任何保证,但引擎长期以来基本一致。所以
键(mergeDeepAll([a,b,c]);//=>[“一”、“二”、“三”、“四”]