作者:joechl | 来源:互联网 | 2023-02-11 09:33
我在if / else逻辑检查后发现一些处理问题。让我们举个例子。
基本配置
const result = {
data: 1,
state: {
pass: 'N'
}
}
对于JS if / else检查,逻辑检查后不应显示日志
function checking() {
if(result.state.pass !== 'Y') {
return result;
}
console.log("Should not appear the log")
}
checking()
然后,我尝试使用Ramda cond函数进行翻译
function checking() {
R.cond([
[
R.compose(R.not, R.equals('Y'), R.prop('pass'), R.prop('state')),
(res) => res
]
])(result)
console.log("Should not appear the log")
}
checking()
但是,日志出现在Ramda cond示例中。我可否知道
有什么问题吗?
我可以在该示例上进行哪些增强?
谢谢。
1> Scott Sauyet..:
已更新:我本来会向后阅读有关应在何时显示日志的内容。
我的建议如下所示:
const checking = R.when(
R.compose(R.equals('Y'), R.path(['state', 'pass'])),
(res) => {console.log("Should not appear in the log"); return res;}
)
这是我从您的代码到达那里的方式:我的第一步是修复对的使用cond
:
const result1 = {data: 1, state: {pass: 'N'}}
const result2 = {data: 2, state: {pass: 'Y'}}
const checking = R.cond([
[
R.compose(R.not, R.equals('Y'), R.prop('pass'), R.prop('state')),
R.identity
],
[
R.T,
(res) => {console.log("Should not appear in the log"); return res;}
]
])
checking(result1);
//=> {data: 1, state: {pass: 'N'}}
checking(result2);
// logs "Should not appear in the log
//=> {data: 2, state: {pass: 'Y'}}
请注意,这cond
最像一条switch
语句:它接收条件相关对的集合并返回一个函数,该函数将其参数传递给每一对,直到找到条件为真的对,然后返回调用其结果的结果。因此,对于第二个条件,我们只需检查R.T
,它是一个始终返回的函数true
,并用于identity
返回输入。
现在,此新函数接受一个result
对象并返回原样,如果它与初始测试不匹配,则将一条消息记录到控制台。
但这还没有结束。此代码可以重构。
这是我将应用的一个简单修复程序:
const checking = R.cond([
[
R.compose(R.not, R.equals('Y'), R.path(['state', 'pass'])),
R.identity
],
[
R.T,
(res) => {console.log("Should not appear in the log"); return res;}
]
])
只是从更改compose(prop('pass'), prop('state'))
为path(['state', 'pass'])
。这是一个小调整,但我认为这更干净。
下一个变化更具实质性。
const checking = R.ifElse(
R.compose(R.not, R.equals('Y'), R.path(['state', 'pass'])),
R.identity,
(res) => {console.log("Should not appear in the log"); return res;}
)
当我们有一个cond
仅包含两个分支的语句,并且第二个语句处于测试状态时R.T
,可以使用来更清楚地编写此语句ifElse
。这需要一个条件和两个结果,一个用于条件通过时,一个用于失败时。
这可能是您想达到的目标,特别是如果您最终计划在失败条件下执行其他操作时。但是,如果不是这样,而您实际上只需要一个结果,那么对于那些第二个结果只是传递的情况,R.unless
可以对进行进一步的简化ifElse
:
const checking = R.unless(
R.compose(R.not, R.equals('Y'), R.path(['state', 'pass'])),
(res) => {console.log("Should not appear in the log"); return res;}
)
unless
只需检查条件并在条件为假时运行结果,并在条件为真时返回完整的输入。
但是,我们可以拉出的not
由切换以及unless
到when
:
const checking = R.when(
R.compose(R.equals('Y'), R.path(['state', 'pass'])),
(res) => {console.log("Should not appear in the log"); return res;}
)
我可能会把它留在那儿,尽管我可能会log
为了清楚起见而排除一个函数。
所有这些都可以log
在Ramda REPL上获得(包括带有功能的最终版本)。