Ramda 中的嵌套占位符
nested placeholders in Ramda
我正在尝试将函数传递给本身嵌套在更深层函数中的过滤器
从概念上讲,像这样(损坏的)示例:
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`
问题在于在同一函数中多次引用时如何解释 R.__
。如果您没有传入足够的参数,柯里化函数将 return 期望更多参数来填补空白。
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)
)
);
我正在尝试将函数传递给本身嵌套在更深层函数中的过滤器
从概念上讲,像这样(损坏的)示例:
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`
问题在于在同一函数中多次引用时如何解释 R.__
。如果您没有传入足够的参数,柯里化函数将 return 期望更多参数来填补空白。
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)
)
);