2017-06-05 4 views
2

Ich habe den folgenden Code, wo ich in den id füllen will, so ich denke, so etwas zu schreiben:Ramda Find mit Lücken

const data = [ 
{ id: 'some-id' }, 
{ id: 'some-other-id' }, 
{ id: 'third-id' }, 
]; 

const tabIndex = R.findIndex(R.propEq('id', R.__))(data); 

So kann ich es wie diese tabIndex('third-id') verwenden, aber dies ist keine Funktion. Was vermisse ich oder verwirre ich damit?

folgende Arbeiten

const tabIndex = (id) => R.findIndex(R.propEq('id', id))(data); 

Aber ich dachte, das ist der Punkt von R.__ Lücken Funktion.

Antwort

3

Ich denke, dass bei weitem der einfachste Weg, dies zu tun ist

const matchId = (id, data) => R.findIndex(R.propEq('id', id), data); 
matchId('third-id', data); //=> 2 

Wenn Sie wirklich diese Punkte frei machen wollen, bietet Ramda mehrere Funktionen zu helfen, wie useWith und converge (für die ein kann oft lift ersetzen) Dieser nehmen useWith würde.

const matchId = R.useWith(findIndex, [R.propEq('id'), R.identity]); 
matchId('third-id', data); //=> 3 

Aber ich finde die erste Version viel besser lesbar. Sie können beide auf der Ramda REPL finden.


Achten Sie auf die side note from Emissary. Der R.__ Platzhalter wird im Wesentlichen verwendet, um Lücken zwischen die Argumente anzuzeigen, die Sie angeben; als letztes Argument tut es nichts.

3

Ich versuche immer noch, diese dunkle Kunst selbst zu meistern, aber ich denke, das Problem ist, dass R.findIndex ein Prädikat (eine Funktion/Behauptung) als Argument erwartet und nicht zwischen Prädikaten und regulären Curry-Funktionen als Eingabe unterscheidet.

Um dies zu beheben eine neue Funktion (ausgewertet rechts nach links) zusammengesetzt sein kann:

const data = [ 
 
    { id: 'some-id' }, 
 
    { id: 'some-other-id' }, 
 
    { id: 'third-id' } 
 
]; 
 

 
const tabIndex = R.compose(R.findIndex(R.__, data), R.propEq('id')); 
 

 
console.log(tabIndex('third-id')); // 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>

Side Hinweis: die R.__ Platzhalter geschlossen wird automatisch nach fehlenden am weitesten rechts stehenden Argumenten - z.B R.propEq('id') und R.propEq('id', R.__) sind gleichwertig.

+0

'findIndex' weiß nichts über Funktoren; Es funktioniert nur mit Listen (wirklich nur dichte Arrays). Das Problem besteht darin, die Argumente an die richtige Stelle zu bringen, um entsprechend für 'findIndex' und' propEq' aufgerufen zu werden. –

+0

@ScottSauyet Danke für die Klarstellung - falsche Terminologie beiseite, ich denke immer noch, dass es etwas gibt, was ich über Funktionen als Argumente sagen will, gibt es einen "funktionalen" Grund warum und mir fehlt einfach das Vokabular oder vielleicht nur etwas wurde noch nicht implementiert? – Emissary

+1

Die Sache mit Funktionen als Argumente ist, dass sie die richtige Signatur haben müssen. Also hat 'findIndex' den Typ' :: (a -> Boolean) -> [a] -> Number.' Und in diesem Fall steht 'a' nur für Object. Daher muss das an "findIndex" übergebene Prädikat den Typ ':: Object -> Boolean' haben. Aber 'propEq' hat den Typ' :: String -> b -> Objekt -> Boolean'. Bevor wir unsere 'propEq'-Funktion an' findIndex' übergeben, müssen wir die 'String'- und' b'-Eigenschaften teilweise anwenden, um sie mit einer ':: Object -> Boolean'-Funktion zu verlassen.Wir können das tun, wie Sie es hier vorschlagen, oder mit beiden Versionen in meiner Antwort. (1/2) –