Obwohl dies eine sehr einfache und einfache Frage ist, ich denke, es in der Erleichterung einen interessanten Punkt bringt.
Es gibt drei Vorschläge bisher. Ich überspringe @ ftor's Antwort, da es deinen Kommentar darüber ignoriert, dass dies Teil des Lernens von Ramda ist. Aber ich füge seinen Kommentar zum Falten hinzu.
Hier sind die Lösungen:
const lengthDeep = R.compose(R.sum, R.map(R.length));
const lengthDeep = R.compose(R.length, R.flatten);
const lengthDeep = R.reduce((total, xs) => total + R.length(xs), 0);
(Beachten Sie, dass ich von pipe
zu compose
wechselte ich in der Regel compose
verwenden, wenn die Funktion auf eine einzelne Zeile passt, aber ich glaube nicht, von pipe
und compose
als grundlegend. verschiedene Lösungen.)
Diese entsprechen unterschiedlichen Verständnis des Problems.
Version A (R.compose(R.sum, R.map(R.length))
) ist die einfachste, und ich glaube, es bildet am ehesten auf die ursprüngliche Darstellung des Problems: Wir wollen „die Summe der Längen der verschachtelten Arrays“ finden. Diese Version ist die einfachste: Sie findet diese Längen und fügt sie dann zusammen. (Dies ist Ihre Version, die mit der Beobachtung von @ trincot erweitert wurde, dass R.length
anstelle von R.prop('length')
funktioniert.) Dies ist die, die ich wählen würde. Es ist ziemlich einfach und es ist offensichtlich, was es tut.
Version B (R.compose(R.length, R.flatten)
) entspricht einer ganz anderen Auffassung des Problems. Es beantwortet die Frage: "Wenn ich all diese Arrays zu einem zusammenfassen würde, wie lange würde es sein?" Soweit ich das beurteilen kann, ist der einzige Vorteil, dass es der einfachste Code ist. Auf der anderen Seite dauert es wahrscheinlich länger, und es erfordert definitiv viel mehr Platz.
Version C (R.reduce((total, xs) => total + R.length(xs), 0)
) beinhaltet noch eine andere Vorstellung. Der beste Weg, diese Lösung zu beschreiben, ist eine rekursive Beschreibung. Die tiefe Länge eines leeren Arrays von Arrays ist Null. Die tiefe Länge eines Arrays von Arrays, deren erstes Element die Länge n
hat, ist n
plus die tiefe Länge des Rests des Array-Arrays. Wenn Sie so über das Problem nachdenken, könnte diese Version für Sie sein. Es gibt ein anderes Mal, dass Sie es verwenden möchten: Obwohl ich nicht getestet habe, würde ich erwarten, dass es leistungsfähiger ist, da es nur einmal über die äußere Liste läuft.Wenn Sie also feststellen, dass diese Funktion ein Engpass in Ihrem Code war (Sie testen die Leistung, bevor Sie eine Leistungsoptimierung einführen, richtig?), Könnten Sie zu diesem Code wechseln, obwohl der Code wesentlich komplexer ist. (Ich weiß nicht, ob es eine vernünftige punktefreie Version davon gibt. Ich kann kein einfaches sehen, und das ist bereits ausreichend lesbar.)
Wieder würde ich Version A wählen, es sei denn etwas wichtiges veranlasste mich, zu Version C zu wechseln. Das scheint jedoch nicht wahrscheinlich.
All dies ist vielleicht ein sehr langwieriger Weg mit @ ftor Kommentar von anderer Meinung: „Man kann nicht map
, wenn Sie tatsächlich fold
eine Datenstruktur verwendet werden soll.“ Ich würde stattdessen sagen, dass Sie den einfachsten Code verwenden sollten, der Ihrem mentalen Modell des Problems entspricht. Dies muss durch andere Überlegungen wie die Leistung ausgeglichen werden, sollte aber der Standardwert sein. Meine Vorstellung von diesem Problem entspricht absolut dem Modell "nimm alle Längen und füge sie zusammen" hinzu.
Sie sollten 'map' nicht verwenden, wenn Sie eine Datenstruktur" falten ". – ftor