拉姆达的嵌套占位符

时间:2017-08-09 12:32:42

标签: javascript ramda.js

我正在尝试将函数传递给过滤器,过滤器本身嵌套在更深层的函数中

从概念上讲,像这样(破碎)的例子:

const testData = [
  {foo: "foo", bar: ""}
];

const myFilter = a => !R.isEmpty(a);

const clean = R.when(
    R.either(R.is(Array), R.is(Object)),
    R.pipe(
        R.map(a => clean(R.__)(a)),
        R.filter(R.__)
    )
)

const cleanEmpties = clean(myFilter);

cleanEmpties(testData); //fail: should not include `bar`, but it does

正确的方法是什么?

为了说明这一点,这个硬编码的替代方案确实按预期工作:

const cleanEmpties = R.when(
    R.either(R.is(Array), R.is(Object)),
    R.pipe(
        R.map(a => cleanEmpties(a)),
        R.filter(myFilter)
    )
)

cleanEmpties(testData); //working, does not include `bar`

1 个答案:

答案 0 :(得分:1)

问题是因为在同一个函数中多次引用时如何解释R.__。如果你没有传入足够的参数,那么将返回一个curried函数,它需要更多的参数来填补空白。

R.gt(4,3) // true
R.gt(R.__, R.__)(4, 3) //true
R.gt(R.__, R.__)(4)(3) //true
R.gt(R.__, R.__)(4) // function n(r){return 0===arguments.length||b(r)?n:t.apply(this,arguments)}

如果更改函数语法以接受显式arg,则代码按预期工作:

const clean = f => R.when(
  R.either(R.is(Array), R.is(Object)),
  R.pipe(
    R.map(a => clean(f)(a)),
    R.filter(f)
  )
);