2016-03-18 313 views
0

我有一個列表,其中包含的項目,如本: [{name:...}, {name:...}], ...呼叫R.ap的呼叫太多?

我想只提取那些元素,其中name一組正則表達式匹配的任何。

我能夠做到這一點,像這樣:

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點,免費爲好,但線程都通過整個事情,使從matcherscards到結果的單一功能,而可能的,可能會讀少可讀的代碼。

您可以在Ramda REPL中看到此操作。

+0

謝謝你,斯科特,像往常一樣很好的答案。 我真的很高興,當我自己帶着一個稍微不同的問題解決方案時。它是用一些嵌套從對象列表中提取所有可能的屬性。 'const pertinentFields = ['listAfter.id','listBefore.id','list.id'];' 'const extractors = R.ap([R.pipe(R.split('。'), R.pathOr(null))],pertinentFields);' 'const id = R.ap(extractors,[data]);' 所以我嘗試了對這個問題建模上述問題...... –