2016-03-18 4 views
0

У меня есть список, который содержит такие элементы, как это: [{name:...}, {name:...}], ...Слишком много звонков в R.ap?

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

я был в состоянии сделать это так:

const cards = yield ... //Network request to get my list of items 
const matchers = [/^Remaining Space:/, /^Remaining Weight:/, /^Gross:/]; 
const propTester = (prop, pred) => R.pipe(R.prop(prop), R.test(pred)); 
const extractors = R.ap([propTester('name')], matchers); 
const [ spaceCard, weightCard, grossCard ] = 
    R.ap(R.ap([R.find], extractors), [cards]); 

Есть ли способ, чтобы упростить это?

+0

Является ли свойство 'name' фактически динамическим? –

ответ

0

Вот одна возможность:

const matchers = [/^Remaining Space:/, /^Remaining Weight:/, /^Gross:/]; 
const testers = R.map(pred => R.pipe(R.prop('name'), R.test(pred)), matchers); 
const extractors = R.map(R.find, testers) 
const [ spaceCard, weightCard, grossCard ] = R.juxt(extractors)(cards); 

Он предполагает, что 'name' фиксируется, и вы не должны быть в состоянии изменить его динамически. Если да, то будет немного больше работы. Главное - использование R.juxt, которое «применяет список функций к списку значений».

Если мы старались очень трудно, мы могли бы сделать testers очков, насколько это хорошо, но резьб все, что через все это, чтобы сделать одну функцию из matchers и cards к вашим результатам, в то время как это возможно, скорее всего, читать меньше читаемый код.

Вы можете видеть это в действии на Ramda REPL.

+0

Спасибо, Скотт, отличный ответ, как обычно. Я был очень рад, когда я пришел с немного другим решением проблемы самостоятельно. Он должен был извлечь все возможные свойства из списка объектов с некоторой вложенностью. 'const pertinentFields = ['listAfter.id', 'listBefore.id', 'list.id'];' 'const extractors = R.ap ([R.pipe (R.split ('.'), R.pathOr (null))], pertinentFields); ' ' const ids = R.ap (экстракторы, [данные]); ' Поэтому я попытался моделировать вышеупомянутую проблему на этом ... –

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

  • Нет связанных вопросов^_^