2016-03-18 54 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]);' 所以我尝试了对这个问题建模上述问题...... –