2016-07-01 8 views
2

Ich versuche, eine Lodash's mergeLodash's mergeRamda entsprechende Funktion zu finden, die eine rekursive Objektschlüssel-basierte "Merge" oder "erweitern". Das Verhalten ist ähnlich der folgenden:Rekursive "merge" oder "erweitern" mit Ramda?

let merged = R.someMethod(
    { name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }}, 
    { address: { street: 'Pine', number: 33 }} 
); 

console.log(merged); 

// => { name: 'Matt', address: { street: 'Pine', number: 33, suffix: 'Ave' }} 

ich im folgenden pull request bemerkt, dass R.set wurde kurz vorgestellt, aber dann rolled back bald danach. Wurde diese Funktionalität seither von der Ramda-Bibliothek erfasst?

Ist diese Funktionalität in Ramda verfügbar?

Antwort

2

Ramda enthält im Moment keine solche Funktion.

Es hat mehrere Versuche gegeben, einen zu erstellen, aber sie scheinen sich auf die Idee zu konzentrieren, was wirklich von einer solchen Funktion verlangt wird.

Fühlen Sie sich frei zu raise an issue, wenn Sie denken, dass es sich lohnt hinzuzufügen.

+0

Ich denke, es lohnt sich ein Problem zu schaffen, aber ich würde es hassen, die gleichen alten Bits etwa wieder aufzuwärmen, wie mit nicht definierten Werten beschäftigen, Zusammenführen Arrays, etc. Ich weiß nicht wirklich keine nuancierte Meinungen zum Tisch bringen und ich bin mir nicht sicher, ob der Wunsch, die Funktionalität selbst zu haben, an dieser Stelle sehr laut ist ... – Himmel

+0

Wie du willst, natürlich. Ich denke, es gibt einen anhaltenden, aber ziemlich geringen Druck, eine solche Funktion hinzuzufügen. Aber viele, mich eingeschlossen, haben Widerstand geleistet, weil keine API fantastisch aussieht, besonders im Hinblick auf Prototypketten, undefinierte und zyklische Strukturen. Aber es ist wahrscheinlich der Fall, dass das perfekte Wesen der Feind des Guten ist. –

6

Eine relativ einfache rekursive Funktion kann mit R.mergeWith erstellt werden.

function deepMerge(a, b) { 
    return (R.is(Object, a) && R.is(Object, b)) ? R.mergeWith(deepMerge, a, b) : b; 
} 

deepMerge({ name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }}, 
      { address: { street: 'Pine', number: 33 }}); 

//=> {"address": {"number": 33, "street": "Pine", "suffix": "Ave"}, "name": "Matt"} 
+0

Ich nehme an, das hängt davon ab, wie eine solche Funktion funktionieren soll, aber ich bevorzuge jeden Schlüssel/Wert, der als zweites Argument übergeben wird, um einen passenden Schlüssel/Wert zu überschreiben, der als erstes Argument übergeben wurde, trotz des Typs des Wertes. Diese Funktionalität wird von '(R.is (Object, b)) erfasst? ... 'statt' (R.is (Objekt, a))? ... '. – Himmel

+1

Wenn Sie mit verschiedenen Typen auf dem gleichen Schlüssel arbeiten, dann sollten Sie überprüfen, ob "a" und "b" Objekte sind, bevor Sie 'mergeWith' aufrufen. Ich habe das Beispiel aktualisiert, um das ebenfalls zu berücksichtigen. –

+0

Leicht modifizierte Version um mit einfachen Arrays zu arbeiten '' const deepMerge = (a, b) => R.isArrayLike (b) &&! R.is (Objekt, b [0]) ? b : (R.is (Objekt, a) & R.is (Objekt, b))? R.mergeWith (deepMerge, a, b): b''' – baio

Verwandte Themen