0

我有一个列表,其中包含以下项目: [{name:...}, {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]);

有什么办法可以简化吗?

4

1 回答 1

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上看到这一点。

于 2016-03-18T12:47:37.773 回答