首页 > 解决方案 > Dataweave 中的尾递归

问题描述

有没有办法采用递归函数(如下所示)并使其尾递归?我有这样的输入:

{
    "message": "Test   ",
    "read": [
        {
            "test": "   t   "
        }
    ]
}

和这个 Dataweave 函数

fun trimWS(item) = item match {
    case is Array -> $ map trimWS($)
    case is Object -> $ mapObject {
        ($$): $ match {
            case is String -> trim($)
            case is Object -> trimWS($)
            case is Array -> $ map trimWS($)
            else -> $
        }
    }
    case is String -> trim($)
    else -> $
}

标签: dataweave

解决方案


我对您现有的功能进行了一些修改以简化它,并且我还在 Mule 4.2.1 下运行了一些测试。

通过构建一个深度超过 840 层的数据结构,我能够导航和修剪这些字段。我的猜测是由于数据的结构和惰性评估,我能够超过 256 深度,这是 DW 2.0 抛出 StackOverflow 的默认值。

您还可以通过传递运行时参数来增加默认值,它的名称是com.mulesoft.dw.stacksize(例如com.mulesoft.dw.stacksize=500)或您的系统可以处理的任何其他数字。

正如我所说,创建尾递归版本并不容易,它会使代码复杂化,与现有版本相比,它的可维护性会降低,等等。

即使我没有直接回答您的问题,我也希望它有所帮助。

%dw 2.0
output application/json
var ds =  {
    "message": "Test   ",
    "read": [
        {
            "test": "   t   "
        }
    ]
}
var deepData = (0 to 840) as Array reduce (e, acc=ds) -> {value: " TO_TRIM ",next: acc}

fun trimWS(item) = item match {
    case is Array -> $ map trimWS($)
    case is Object -> $ mapObject {($$): trimWS($)}
    case is String -> trim($)
    else -> $
}

---

trimWS(deepData)

推荐阅读