0

Предполагая, у меня есть коллекция:фильтра с «или» в lodash сокращенного выражения

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

Как я могу фильтровать так только тип «а» и «б» останутся? Я бы ожидать, чтобы сделать что-то вроде:

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

Т.е. используйте _.matchesProperty iteratee, чтобы обрабатывать несколько типов соответствия, но это не работает. Знаете ли вы какой-либо простой способ достичь этого, не определяя настраиваемую функцию?

+2

Что так важно в том, что вы не создаете свою собственную функцию? 'collection = _.filter (collection, function (e) {return e.type == 'a' || e.type == 'b'});' Done. Еще лучше с ES2015: 'collection = _.filter (collection, e => e.type == 'a' || e.type == 'b');' –

+0

Это не блокиратор, но я был в основном удивлен тем, что это не было поддержано, и некоторые исследования не нашли ничего, поэтому хотелось бы подтвердить, что это невозможно в lodash. Кроме того, я играю с более функциональным способом делать вещи, поэтому я надеялся, что кто-то придумает интересное использование _property, _partparty или что-то подобное. Но вы совершенно правы, это легко сделать с помощью пользовательской функции и даже в элегантном стиле в ES6. – wap300

+2

Вы можете рассмотреть [соответствие()] (https://lodash.com/docs#conforms), где свойство 'type' использует [includes] (https://lodash.com/docs#includes), которое [связывает ] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind) '['a', 'b']' в качестве первого параметра. – ryeballar

ответ

1

Отлично, чтобы вставить предложение ryeballar в ответ:

Предполагая, что у меня есть:

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

Ниже будет отфильтровывать только 'а' и 'B' типа:

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

Не самый красивый код, но я думаю, что удары ES5 и показывает, как работает _.conforms. Именно то, что я искал!

+4

*« Не самый красивый код, но я думаю, что это функция ES5 ... »* Um ...глаз смотрящего, я думаю. Я бы * много видел скорее простой «фильтр». –

+1

Ну, ты, наверное, прав, но тем не менее это была интересная головоломка. :) – wap300

+0

Вы говорите такие вещи, как «сокращенное выражение» и «функция ES5», как будто они имеют какой-то смысл ... – naomik

2

Вы можете использовать _.filter с функцией, чтобы сделать его более функциональным, но простой .filter также хватает:

ES5:

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

ES6

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

Люди голосуют над своими задницами, пропустив этот простой, простой ответ. – naomik

+0

Спасибо @naomik. Я думаю, когда вы делаете downvote stackoverflow, попросите причину. Я не понимаю, почему люди сжимаются, даже не понимая проблемы/решения. –

+0

Я не проголосовал за это, но я полагаю, что это было отклонено, потому что я специально исключил это решение в своем вопросе: «без определения пользовательской функции « – wap300

Смежные вопросы