2017-02-08 12 views
1

Я немного перегружен всеми функциями, доступными мне в Lodash, поэтому я надеюсь, что кто-то может указать мне на тот, который я уверен, существует, что будет делать следующее для меня. Я хочу, чтобы иметь возможность передать массив и условие поиска и пропустить его через все согласованные элементы, что позволяет мне запускать функцию для каждого. То, что у меня есть на данный момент, является чем-то вроде этого:Найти подходящие элементы в массиве и сделать что-то для каждого матча

_.each(myArray, (item) => { 
    if (item.field=="whatever") { 
     console.log("Matched by "+item.name); 
    } 
}); 

Это нормально работает. Просто я уверен, что у Lodash есть способ переместить item.field=="whatever" в аргументы функции как-то, и я предпочел бы пойти с более идиоматическим способом Lodash, если смогу.

ответ

1

Это просто, что я уверен, что Lodash есть способ для меня, чтобы переместить item.field == "whatever" в аргументы функции как-то

Если вы хотите, чтобы найти все элементы, совпадающие в массиве на основе аргументов вы передаете, то вы могли бы использовать _.filter method, который можно использовать _.matches shorthand внутренне:

_.filter(myArray, { field: 'whatever' }); 

Тем не менее, все равно нужно цикл по пунктам, если вы хотите сделать что-то для каждого MATC ч:

_.each(_.filter(myArray, { field: 'whatever' }), item => { 
    console.log("Matched by " + item.name); 
}); 

В качестве альтернативы, если вы хотите другой способ написания этого, вы можете обернуть отфильтрованные элементы с lodash object wrapper, _(), что существенно позволяет СЦЕПЛЕНИЕ, тем самым позволяя вам приковать _.each() метод:

_(_.filter(myArray, { field: 'whatever' })).each(item => { 
    console.log("Matched by " + item.name); 
}); 

Или более читабельным версия:

var matchedItems = _.filter(myArray, { field: 'whatever' }); 
_(matchedItems).each(item => { 
    console.log("Matched by " + item.name); 
}); 

Лично я бы, вероятно, просто сохранить то, что вы изначально написали, так как это короткий, читаемый и легко поддерживать.

+1

Рад узнать, что я ничего не пропустил! Я не знаком с синтаксисом, который у вас есть: '_ (matchedItems) .each (item => {'. Я бы написал его как '_.each (matchedItems, item => {'. В чем разница? –

+1

@JohnMoore. Оба они делают то же самое, это просто альтернативный способ написания. ['_()' - обертка объекта lodash] (https://lodash.com/docs#lodash), которая преобразует коллекцию в объект lodash, который позволит вам связать другие методы lodash. Например, метод '_.filter()' возвращает простой массив и, обернув его '_ (_. filter())', вы можете затем связать другие методы lodash, такие как '_ (_. filter()). each()'. –