Ramda:mergeDeepRight + mergeAll(...也许mergeDeepRightAll)

时间:2017-10-04 06:54:08

标签: javascript functional-programming ramda.js

目前在Ramda,如果我想深度合并(右)多个对象我......

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 )),则返回{ one:1, two: { three:3 } },因为_.mergeAll不深

是否有更整洁的方式深度合并(右)多个对象?有点像...

_.mergeDeepRightAll( a, b, c )

1 个答案:

答案 0 :(得分:5)

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}}

如果你想提供不作为数组的参数,你可以unapply,尽管数组更符合R.mergeAll的签名

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

mergeDeepAll(a, b, c)

我注意到这些示例实际上没有任何冲突的密钥,所以直接R.mergeAll可以在这里工作。但是,这些输出都没有按照您提到的确切顺序输出。