使用 lodash 函数映射 curried 过滤器

Mapping a curried filter using lodash functions

我想创建一个函数,在给定谓词列表的情况下生成一个数组过滤器。

使用lodash,我定义:

const { curryRight, filter, flowRight } = require('lodash');

const curriedFilter = curryRight(filter);
const filterFromPredicates = (predicateList) => flowRight(...predicateList.map(curriedFilter));

但这给出了错误的答案:

const filter = filterFromPredicates([(x) => x > 2, (x) => x > 4])
filter([1,2,3,4,5,6,7,8,9]) // -> [1,2,3,4,5,6,7,8,9]

我期望的地方 [5,6,7,8,9]

然而,如下定义 curried 过滤器有效:

const curriedFilter = (predicate) => (array) => array.filter(predicate);

我是不是误解了curryRight的用法?

这个怎么样:

function filterFromPredicates(predicates) {
 return (...args) => predicates
  .map(predfn=> predfn(...args))
  .every(a=>a)
}
[1,2,3,4,5,6,7,8,9].filter(filterFromPredicates([(x) => x > 2, (x) => x > 4]))

如果您希望所有内容都在同一个函数中,那么:

function filterFromPredicates(predicates) {
     return (someArray)=> someArray.filter((...args) => predicates
      .map(predfn=> predfn(...args))
      .every(a=>a))
    }

const filter = filterFromPredicates([(x) => x > 2, (x) => x > 4])
filter([1,2,3,4,5,6,7,8,9])

那会return如你所愿^

您的代码不起作用,因为映射将 3 个参数传递给 curriedFilter - 谓词、索引和原始数组。您只需将谓词传递给 curriedFilter

const { curryRight, filter, flow, ary } = _;

const curriedFilter = ary(curryRight(filter), 1);

const filterFromPredicates = (predicateList) => flow(...predicateList.map(curriedFilter)); // limit the number of params passed to curriedFilter

const fn = filterFromPredicates([x => x > 2, x => x < 6]); // don't override the filter you've imported

const result = fn([1,2,3,4,5,6,7,8,9]); // -> [3, 4, 5]

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

另一种选择是限制参数的数量 curriedFilter 接受 _.ary():

const { curryRight, filter, flow, ary } = _;

const curriedFilter = ary(curryRight(filter), 1);

const filterFromPredicates = (predicateList) => flow(...predicateList.map(curriedFilter)); // limit the number of params passed to curriedFilter

const fn = filterFromPredicates([x => x > 2, x => x < 6]); // don't override the filter you've imported

const result = fn([1,2,3,4,5,6,7,8,9]); // -> [3, 4, 5]

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

您可以使用 _.overEvery() 生成要传递给 curried 过滤器的谓词:

const { flow, overEvery, curryRight, filter } = _;

const filterFromPredicates = flow(overEvery, curryRight(filter));

const fn = filterFromPredicates(x => x > 2, x => x < 6); // don't override the filter you've imported

const result = fn([1,2,3,4,5,6,7,8,9]); // -> [3, 4, 5]

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

如果你使用 lodash/fp 你需要 _.curryRight() 因为函数是自动柯里化的,并且参数是迭代优先数据最后:

const { flow, overEvery, filter } = _;

const filterFromPredicates = flow(overEvery, filter);

const fn = filterFromPredicates([x => x > 2, x => x < 6]); // don't override the filter you've imported

const result = fn([1,2,3,4,5,6,7,8,9]); // -> [3, 4, 5]

console.log(result);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>