2017-10-04 191 views
1

目前Ramda如果我想合并深(右)的多个对象我....Ramda:mergeDeepRight + mergeAll(......也许mergeDeepRightAll)

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) 

回答

3

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可以在这里工作。但是,这些输出都不是按照您提到的顺序排列的。

+0

关于输出顺序:对象属性顺序仅保证ES 2015+。无论如何,OP应该谨慎依赖它。 –

+0

请注意,键顺序的改变主要是由于某种输出格式(比如说'console.log'或'JSON.stringify')。是的,在es6之前没有任何保证,但引擎长期以来基本一致。所以'keys(mergeDeepAll([a,b,c])); // => [“one”,“two”,“three”,“four”]'。 –