使用 Ramda ifElse 函数有条件地返回值

发布时间:2021-03-05 06:53

js,我正在尝试通过在我的代码中零碎地使用它来学习它。

我试图解决的问题是检查一个对象是否为空。如果为空则返回一个空白对象,否则返回原始对象。

到目前为止编写的代码:

R.ifElse(isEmptyObj, R.always({}), R.always)({a:1})

现在的问题是如果isEmpty返回true,那么R.always返回一个返回{}的函数。但是然后 isEmpty 为 false 我们想要返回传递给函数的相同对象,因此 R. 总是使用该对象执行,因此我们得到一个函数作为输出。

所以,在一种情况下我得到一个对象,而在另一种情况下我得到一个函数。

回答1

R.always 第一次被一个值调用时(我们称之为 X),它返回一个第二个函数,该函数总是返回第一个函数用 (X) 调用的值。由于您调用 R.always 时没有先使用参数调用它,因此您得到的结果是第二个函数。

在这种情况下,您希望将原始值传递给 R.ifElse,因此使用 R.identity

const { ifElse, isNil, always, identity } = R

const fn = ifElse(isNil, always({}), identity)

console.log(fn({a:1})) // {a:1}
console.log(fn(null)) // {}
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.1/ramda.min.js" integrity="sha512-rZHvUXcc1zWKsxm7rJ8lVQuIr1oOmm7cShlvpV0gWf0RvbcJN6x96al/Rp2L2BI4a4ZkT2/YfVe/8YvB2UHzQw==" crossorigin="anonymous"></script>