0

En supposant que j'ai une collection:avec filtre 'ou' dans l'expression abrégée lodash

var collection = [{type: 'a'}, {type: 'b'}, {type: 'c'}, {type: 'd'}]

Comment puis-je filtrer si seulement a 'types et 'b' restera? Je me attends à faire quelque chose comme:

_filter(collection, ['type', 'a', 'b'])

à savoir utilisez _.matchesProperty iteratee shorthand pour gérer plusieurs types correspondants, mais cela ne fonctionne pas de cette façon. Connaissez-vous un moyen simple d'y parvenir sans définir de fonction personnalisée?

+2

Qu'y a-t-il d'important de ne pas créer votre propre fonction? 'collection = _.filter (collection, fonction (e) {return e.type == 'a' || e.type == 'b'});' Fait. Encore mieux avec ES2015: 'collection = _.filter (collection, e => e.type == 'a' || e.type == 'b');' –

+0

Ce n'est pas un bloqueur, mais j'étais plutôt surpris que Ce n'était pas pris en charge, et fait des recherches pour ne rien trouver, donc je voulais confirmer que ce n'est pas possible dans lodash. En outre, je joue avec une façon plus fonctionnelle de faire les choses, alors j'espérais que quelqu'un trouverait une utilisation intéressante de _property, _.partial ou quelque chose de semblable. Mais vous avez parfaitement raison, cela peut être facilement fait avec une fonction personnalisée, et même de manière élégante en ES6. – wap300

+2

Vous pouvez utiliser [conformes()] (https://lodash.com/docs#conforms), où la propriété 'type' utilise [includes] (https://lodash.com/docs#includes) qui [lie ] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind) '['a', 'b']' comme premier paramètre. – ryeballar

Répondre

1

Génial, de mettre la suggestion de ryeballar dans une réponse:

En supposant que j'ai un:

var collection = [{type: 'a'}, {type: 'b'}, {type: 'c'}, {type: 'd'}]

Ci-dessous filtrera uniquement 'a' et 'b' types:

_.filter(collection, _.conforms({'type': _.partial(_.includes, ['a', 'b'])}))

pas le code plus jolie, mais je pense que beats Fonction ES5 et montre comment fonctionne _.conforms. Exactement ce que je cherchais!

+4

*" Pas le plus joli code, mais je pense que la fonction ES5 bat ... "* Euh ...oeil du spectateur, je suppose. Je verrais plutôt un simple appel de filtre. –

+1

Eh bien, vous avez probablement raison, mais c'était quand même un puzzle intéressant. :) – wap300

+0

Vous dites des choses comme "expression abrégée" et "fonction ES5" comme si ceux-ci ont une signification ... – naomik

2

Vous pouvez utiliser le _.filter avec une fonction pour le rendre plus fonctionnel, simple mais .filter suffira aussi:

ES5:

collection.filter(function (i) { 
    return i.type === 'a' || i.type === 'b'; 
}); 

ES6

collection.filter(i => i.type === 'a' || i.type === 'b') 
+0

Les gens ont la tête haute - voter cette réponse simple et directe. – naomik

+0

Merci @naomik. Je pense que quand vous downvote stackoverflow devrait demander une raison. Je ne comprends pas pourquoi les gens déprécient sans même comprendre le problème/la solution –

+0

Je n'ai pas voté contre celui-ci, mais je suppose qu'il a été décliné parce que j'ai spécifiquement exclu cette solution dans ma question: "sans définir de fonction personnalisée " – wap300

0
collection.filter(i => ['a', 'b'].includes(i.type));