我有一个列表,其中包含以下项目:
[{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]);
有没有办法简化?
答案 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
点免费,但是通过整个事情将所有这些内容从matchers
和cards
转换为尽管如此,您的结果可能会读取可读性较低的代码。
您可以在 Ramda REPL 上看到这一点。