gpt4 book ai didi

javascript - Ramda 中的嵌套占位符

转载 作者:行者123 更新时间:2023-12-03 03:41:44 26 4
gpt4 key购买 nike

我试图将一个函数传递到一个过滤器中,该过滤器本身嵌套在更深的函数中

从概念上讲,类似于这个(损坏的)示例:

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.__ 的解释方式所致。如果您没有传递足够的参数,柯里化(Currying)函数将返回,它需要更多的参数来填补空白。

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)}

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

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

关于javascript - Ramda 中的嵌套占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45590821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com