2015-03-25 10 views
8

Sto tentando di farlo in modo funzionale (con Ramda). Il mio JSON è strutturato in questo modoRamda: Come filtrare in base a un valore in un array nidificato

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

e sto provando a filtrare sulla base di un valore nella proprietà 'tag', ma non hanno avuto successo. Sono in grado di filtrare su ints/string (età e nome utente), ma non riesco a capire come farlo con i valori negli array annidati (tag). Qualsiasi aiuto sarebbe molto apprezzato.

risposta

15

Ci sono molti modi per farlo. Ma penso che quello più pulito sarebbe:

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

Lo si può vedere in azione nel Ramda REPL.

Altre opzioni, soprattutto se il campo è più profondamente annidata è a compose (o pipe) prop o path chiamate con contains o, eventualmente, di approfittare di lenti.

Ancora, penso che la risposta sopra sia più leggibile.

+0

che mi sembra una buona soluzione. E mi piace il modo in cui legge: "filtro in cui i tag contengono 'divertimento'" suona molto come la descrizione del problema. –

+0

Grazie mille. Dal post ho trovato questo 'var byTag = R.curry (function (tag, items) { var containsTag = function (val) { return R.contains (tag, val.tags); }; return R .filter (containsTag, items); }); 'ma sicuramente non è bello come la tua soluzione. Per qualsiasi ragione, usando R.contains, il valore della proprietà non mi è nemmeno passato per la testa. Grazie ancora! – user3783301

+0

Non so se altre librerie con funzioni 'where' simili consentano anche un predicato in questo posto. Siamo abbastanza contenti di questa funzione. –