2017-10-04 2 views
1

Derzeit in Ramda, wenn ich tief merge wollen (rechts) mehrere Objekte I ....Ramda: mergeDeepRight + mergeall (... vielleicht 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 } } 

Wenn ich _.mergeAll (dh _.mergeAll(a, b, c)) es gibt { one:1, two: { three:3 } } als _.mergeAll ist nicht tief

Gibt es eine ordentlichere Möglichkeit der tiefen Zusammenführung (rechts) mehrerer Objekte? So etwas wie ...

_.mergeDeepRightAll(a, b, c) 

Antwort

3

reduce könnte ein guter Ruf hier sein, da wir eine Reihe von Elementen in einer Transformation.

Wenn wir den Eingang

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

Wir können

const mergeDeepAll = reduce(mergeDeepRight, {}) 

mergeDeepAll([a, b, c]) 

// -> {"four": {"five": 5}, "one": 1, "three": {"four": 4}, "two": {"three": 3}} 

tun ändern Und wenn man die Argumente nicht als Array zur Verfügung zu stellen wollte, können Sie unapply es, obwohl ein Array mehr in-line mit R.mergeAll ‚Unterschrift

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

mergeDeepAll(a, b, c) 

werde ich, dass die Prüfung beachten Tatsächlich gibt es keine in Konflikt stehenden Schlüssel, also würde hier ein straight up R.mergeAll funktionieren. Keine dieser Ausgaben in der von Ihnen genannten Reihenfolge.

+0

Über die Reihenfolge der Ausgabe: Objekt-Eigenschaft Reihenfolge ist nur garantiert ES 2015+. OP sollte vorsichtig sein, sich darauf zu verlassen. –

+0

Beachten Sie, dass die Änderung der Schlüsselreihenfolge hauptsächlich auf ein bestimmtes Ausgabeformat zurückzuführen ist (sagen wir 'console.log' oder' JSON.stringify'). Ja, es gab keine Garantien vor es6, aber die Engines waren lange Zeit weitgehend konsistent. Also 'Schlüssel (mergeDeepAll ([a, b, c])); // => ["eins", "zwei", "drei", "vier"]]. –