首页 > 解决方案 > Ramda:在 R.ifElse() 函数调用中访问输入对象的属性

问题描述

我有这个现有的功能:

  const inferProcessingError = R.ifElse(
    R.propEq('conversionJobStatus', 3),
    R.always('Last Process failed with error; please contact DevOps'),
    R.always(null)
  );

像这样调用:

const msg = inferProcessingError(jobStruct || {});

有了这个jobStruct:

{"id":9,"mediaGroupId":1000000,"conversionJobStatus":3,
  "errorDetails": {
     "Cause": {
        "errorMessage": "MediaConvert Job Failed with ERROR status: ERROR Video codec [indeo4] is not a supported input video codec",
     },
     "Error": "Error",
   }
}

我需要创建一个包含Cause.errorMessage元素数据的错误消息字符串。

使用本机 JavaScript 函数这将非常简单,但我正在学习 Ramda,并且只想修改现有代码以包含在错误消息中。

AnR.prop('Cause')['errorMessage']可以工作,只是我不知道如何引用传递给inferProcessingError语句的 jobStruct。

我可以看到R.ifElse后续的 Ramda 函数能够获取该引用,但是当我R.prop('Cause')在错误消息字符串中嵌入 an 时,它解析为一个函数而不是Cause元素的值,因为它似乎正在等待数据结构。

那么......我如何获得对 jobStruct 参考的访问权限?(arguments此处未定义)。

更新: 我可以通过引用原来的 jobStruct 来让它工作,R.Prop('ErrorDetails', jobStruct)['Cause']['errorMessage']但这对我来说似乎相当笨拙......

但是,如果调用inferProcessingError实际上是在map语句内部并引用更大结构中的元素,则映射索引不可用于引用R.prop.

标签: javascriptramda.js

解决方案


也许您可以使用pipeandpath方法来实现这种“ramda 方式”。

首先使用 ramda 的函数从输入对象path()中提取嵌套值。接下来,将其包含在将提取的消息转换为使用自定义错误前缀格式化的字符串中:errorMessagejobStructpipe()

const incCount = R.ifElse(
    R.propEq('conversionJobStatus', 3),
    
    /* Evaluate this pipe if the error case is satisfied */
    R.pipe(
        /* Path to extract message from input object */
        R.path(["errorDetails", "Cause", "errorMessage"]), 
        /* Prefix string to extracted error message */
        R.concat('Custom error prefix:')),
    
    R.always('')
);

incCount({"id":9,"mediaGroupId":1000000,"conversionJobStatus":3,
  "errorDetails": {
     "Cause": {
        "errorMessage": "MediaConvert Job Failed with ERROR etc etc",
     },
     "Error": "Error",
   }
});

这是一个工作示例-希望对您有所帮助!

更新

感谢@customcommander 建议使用concat字符串前缀,以及为第二个分支返回一个空字符串值


推荐阅读