2015-03-25 21 views
8

Próbuję to osiągnąć w sposób funkcjonalny (z Ramda). Moje JSON jest skonstruowany jak toRamda: Jak filtrować w oparciu o wartość w zagnieżdżonej tablicy

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

i próbuję filtrować na podstawie wartości nieruchomości „Tagi”, ale nie były udane. Jestem w stanie filtrować na int/ciągi (wiek i nazwa użytkownika), ale nie mogę wymyślić, jak to zrobić z wartościami w zagnieżdżonych tablicach (znacznikach). Każda pomoc byłaby bardzo cenna.

Odpowiedz

15

Istnieje wiele sposobów na zrobienie tego. Ale myślę, że najczystsze jeden będzie:

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

Można zobaczyć go w akcji w Ramda REPL.

Inne opcje, zwłaszcza, jeśli pole jest bardziej głęboko zagnieżdżony jest do compose (lub pipe) prop lub path rozmowy z contains lub ewentualnie skorzystać z soczewek.

Nadal myślę, że powyższa odpowiedź jest najbardziej czytelna.

+0

który wygląda mi na miłe rozwiązanie. I podoba mi się sposób, w jaki brzmi: "filtr, w którym znaczniki zawierają" zabawę "" brzmi bardzo podobnie do opisu problemu. –

+0

Dziękuję bardzo. Od czasu opublikowania wpadłem na ten temat: "var byTag = R.curry (function (tag, items) { var containsTag = function (val) { return R.contains (tag, val.tags); }; return R .filter (containsTag, items); }); 'ale zdecydowanie nie jest tak piękny jak twoje rozwiązanie. Z jakiegoś powodu użycie R.contains jako wartości nieruchomości nawet nie przyszło mi do głowy. Dzięki jeszcze raz! – user3783301

+0

Nie wiem, czy inne biblioteki z podobnymi funkcjami 'where' również zezwalają na predykat w tym miejscu. Jesteśmy bardzo zadowoleni z tej funkcji. –

Powiązane problemy