dataweave - 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 -> $
}
解决方案
我对您现有的功能进行了一些修改以简化它,并且我还在 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)
推荐阅读
- spring-boot - Spring Cache+Redis 缓存不根据方法/类名计算键
- azure - 已发布的 Web 应用程序 Auth AD B2C:/signin/B2C_1_mysigninoutpolicy 的 Error404
- java - 如何解决错误:无法在 SpringBoot 应用程序中找到或加载主类
- android - fromjson 无法解析科学记数法 - Android
- apache-spark - 使用 spark 向量化一组行
- c++ - 无法显示矢量
- data-structures - 如何在 num 库中的 BigInt 结构上实现 Deserialize 特征?
- swift - 仅动态调整元素的一个维度
- docker - nginx container fail to start
- excel - 列表框中的选定行复制到另一个列表框