2015-03-25 6 views
8

Ich versuche, dies auf eine funktionale Weise (mit Ramda) zu erreichen. Meine JSON ist wie diesRamda: Wie filtert man basierend auf einem Wert in einem verschachtelten Array

[ 
    {username: 'bob', age: 30, tags: ['work', 'boring']}, 
    {username: 'jim', age: 25, tags: ['home', 'fun']}, 
    {username: 'jane', age: 30, tags: ['vacation', 'fun']} 
] 

strukturiert und ich versuche, basierend auf einem Wert in der ‚Tags‘ Eigenschaft zu filtern, aber noch nicht erfolgreich gewesen. Ich bin in der Lage, auf Ints/Strings (Alter und Benutzername) zu filtern, aber ich kann nicht herausfinden, wie dies mit Werten in verschachtelten Arrays (Tags) zu tun. Jede Hilfe würde sehr geschätzt werden.

Antwort

15

Es gibt viele Möglichkeiten, dies zu tun. Aber ich denke, das sauberste wäre:

R.filter(R.where({tags: R.contains('fun')})) 

Sie es in Aktion in der Ramda REPL sehen können.

Andere Optionen, vor allem, wenn das Feld mehr verschachtelt ist, tief zu compose (oder pipe) prop oder path Anrufe mit contains oder möglicherweise Vorteil von Linsen zu nehmen.

Dennoch denke ich, dass die obige Antwort am besten lesbar ist.

+0

das sieht aus wie eine nette Lösung für mich. Und ich mag die Art, wie es liest: "Filter, wo Tags enthält" Spaß "" klingt sehr ähnlich wie die Problembeschreibung. –

+0

Vielen Dank. Seit dem Posten habe ich diese "var byTag = R.curry (Funktion (tag, items)) { var enthält Tag = Funktion (val) { Rückkehr R.contains (Tag, val.tags); }; Rückkehr R .filter (containsTag, items); }); 'aber es ist definitiv nicht so schön wie deine Lösung. Aus irgendeinem Grund, die R. contains als Eigenschaft Wert verwenden, kam mir nicht einmal in den Sinn. Danke noch einmal! – user3783301

+0

Ich weiß nicht, ob andere Bibliotheken mit ähnlichen 'Where'-Funktionen auch ein Prädikat an dieser Stelle erlauben. Wir sind sehr glücklich mit dieser Funktion. –

Verwandte Themen