对R.ap的调用太多了?

时间:2016-03-18 11:54:50

标签: javascript ramda.js

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

有没有办法简化?

1 个答案:

答案 0 :(得分: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 上看到这一点。