2016-06-02 12 views
1

Mit Ramda undFiltern (eindeutige) Anpassungswerte

const data = [{ 
    "id": "a", 
    "name": "A" 
}, { 
    "id": "b", 
    "name": "B" 
}, { 
    "id": "c", 
    "name": "C" 
}] 

I

tun können
const findById = (id, data) => R.pipe(
    R.find(R.propEq('id', id)) 
)(data) 

const id = "a" 

findById(id, data) // => { "id": "a", "name": "A" } 

aber was ist eine Reihe von ID-Werte nehmen eine Liste nur mit den passenden Objekte zurück? I.e.

So etwas wie zupfen, wählen usw., aber für Werte statt Schlüssel, wo jeder Wert als einzigartig angenommen werden kann.

(Bevorzugt knappe, vielleicht sogar punktfreie Varianten).

Der nächste, den ich bisher bekommen habe, ist der Austausch der? für beide

R.filter(x => R.contains(x.id, ids)) 

oder

R.takeWhile(x => R.contains(x.id, ids)) 

wodurch man sowohl eine das Objekt.

Danke! Ich bin ziemlich neu in Ramda und das oben genannte ist hauptsächlich wie ich es benutze, so dass alle Einblicke rund um das auch sehr willkommen wären.

UPDATE

Dies ist eine nicht-Frage. Es funktioniert tatsächlich in der REPL, aber nicht für Tests in meinem lokalen Umfeld (Atom + Wallaby + AVA). Nicht sicher, warum, aber ich werde updaten, wenn ich es herausfinde. Siehe verifizierte Antwort für Variationen mit einem statischen und einem dynamischen Schlüssel. Wäre immer noch Spaß, von anderen Ansätzen zu hören.

UPDATE 2

Stellt sich heraus, es nur ein Tippfehler war. Vielleicht sollte ich es überdenken, komplexe Hashes für Test-IDs zu verwenden. : D

Antwort

2

(Bevorzugt knappe, vielleicht sogar punktfreie Varianten).

Dies ist das falsche Ziel. Bevorzugen Sie Code, der gut liest und funktioniert. Die Codierung ist kein Spiel, in dem die kürzeste Antwort gewinnt, außer wenn coding is a game where the shortest answer wins. Wenn Sie "Golf" Code wollen, sollten Sie dort fragen.

Wie auch immer, Sie haben so ziemlich die Antwort selbst gegeben.

var data = [{ 
    "id": "a", 
    "name": "A" 
}, { 
    "id": "b", 
    "name": "B" 
}, { 
    "id": "c", 
    "name": "C" 
}]; 

const findByIds = R.curry((ids, data)=> 
    R.filter(x=> R.contains(x.id, ids), data)); 

findByIds (['a', 'c']) (data); 
//=> [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}] 

Vielleicht würden Sie "id" wie eine dynamische Eigenschaft sein

var data = [{ 
    "id": "a", 
    "name": "A" 
}, { 
    "id": "b", 
    "name": "B" 
}, { 
    "id": "c", 
    "name": "C" 
}]; 

const findByProp = R.curry((prop, ids, data) => 
    R.filter(x=> R.contains(x[prop], ids), data)); 

findByProp ('id', ['a', 'c'], data); 
//=> [{"id": "a", "name": "A"}, {"id": "c", "name": "C"}] 
+0

ich total über terse zustimmen, wenn es auf Kosten der Klarheit zu viel kommt. Sollte das klar gemacht haben! :) Danke für die Antwort. Wies mich darauf hin, dass es tatsächlich in der REPL funktioniert (Link oben hinzugefügt). Funktioniert nicht lokal (testet mit Atom + Wallaby + AVA) aus irgendeinem Grund. Ich werde aktualisieren, wenn ich es herausfinden. – jiku

+1

Werden ES6 Pfeilfunktionen in Ihrer Umgebung unterstützt? – naomik

+0

Yeah ES6 ist in Ordnung. Es stellte sich heraus, dass es nur ein Tippfehler war. Vielleicht sollte ich es überdenken, komplexe Hashes für Test-IDs zu verwenden.: D – jiku