2017-10-04 8 views
1

私は深いマ​​ージする場合(右)複数のオブジェクトI ....RAMDA:mergeDeepRight + mergeAll(...多分mergeDeepRightAll)現在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) 

答えて

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"] '。 –