将Javascript if / else转换为Ramda cond问题

use*_*831 0 if-statement ramda.js

我在if / else逻辑检查后发现一些处理问题。让我们举个例子。

基本配置

const result = {
  data: 1,
  state: {
    pass: 'N'
  }
}
Run Code Online (Sandbox Code Playgroud)

对于JS if / else检查,逻辑检查后不应显示日志

function checking() {
  if(result.state.pass !== 'Y') {
    return result;
  }

  console.log("Should not appear the log")
}

checking()
Run Code Online (Sandbox Code Playgroud)

然后,我尝试使用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()
Run Code Online (Sandbox Code Playgroud)

但是,日志出现在Ramda cond示例中。我可否知道

  • 有什么问题吗?

  • 我可以在该示例上进行哪些增强?

谢谢。

Sco*_*yet 5

已更新:我本来会向后阅读有关应在何时显示日志的内容。


我的建议如下所示:

const checking = R.when(
  R.compose(R.equals('Y'), R.path(['state', 'pass'])),
  (res) => {console.log("Should not appear in the log"); return res;}
)
Run Code Online (Sandbox Code Playgroud)

这是我从您的代码到达那里的方式:我的第一步是修复对的使用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'}}
Run Code Online (Sandbox Code Playgroud)

请注意,这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;}
  ]
])
Run Code Online (Sandbox Code Playgroud)

只是从更改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;}
)
Run Code Online (Sandbox Code Playgroud)

当我们有一个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;}
)
Run Code Online (Sandbox Code Playgroud)

unless 只需检查条件并在条件为假时运行结果,并在条件为真时返回完整的输入。


但是,我们可以拉出的not由切换以及unlesswhen

const checking = R.when(
  R.compose(R.equals('Y'), R.path(['state', 'pass'])),
  (res) => {console.log("Should not appear in the log"); return res;}
)
Run Code Online (Sandbox Code Playgroud)

我可能会把它留在那儿,尽管我可能会log为了清楚起见而排除一个函数。

所有这些都可以logRamda REPL上获得(包括带有功能的最终版本)。