如何在Mule DataWeave中实现多数组连续迭代计数?
实现DataWeave中跨map迭代的全局连续计数器
问题背景
使用DataWeave的map函数遍历数组时,内置迭代计数器$$仅在当前map范围内有效,每次新的map调用后会重置为0。需要实现全局连续递增的计数,让外层数组和内层子数组的计数依次衔接、无中断。
请求负载
[ { "id": 1 }, { "id": 2 }, { "id": 3 }, { "id": 4 } ]
期望输出
{ "products": [ { "iterater": 1, "child": [ { "childIterater": 2 }, { "childIterater": 3 }, { "childIterater": 4 }, { "childIterater": 5 } ] }, { "iterater": 6, "child": [ { "childIterater": 7 }, { "childIterater": 8 }, { "childIterater": 9 }, { "childIterater": 10 } ] }, { "iterater": 11, "child": [ { "childIterater": 12 }, { "childIterater": 13 }, { "childIterater": 14 }, { "childIterater": 15 } ] }, { "iterater": 16, "child": [ { "childIterater": 17 }, { "childIterater": 18 }, { "childIterater": 19 }, { "childIterater": 20 } ] } ] }
解决方案
通过计算元素的全局位置生成连续计数,无需依赖局部的$$计数器。核心思路是根据外层索引和内层索引,推导每个计数的全局值:
%dw 2.0 output application/json var inputSize = sizeOf(payload) // 每个外层元素占用的总计数:1个自身 + inputSize个子元素 var perOuterItemCount = inputSize + 1 --- { products: payload map ((outerItem, outerIdx) -> { iterater: (outerIdx * perOuterItemCount) + 1, child: payload map ((innerItem, innerIdx) -> { childIterater: (outerIdx * perOuterItemCount) + 2 + innerIdx }) }) }
代码说明
inputSize:获取输入数组的长度(示例中为4),用于计算每个外层元素需要占用的计数位数perOuterItemCount:每个外层元素对应的总计数数量,即自身1个加上子元素的inputSize个,示例中为5- 外层
iterater计算:(outerIdx * perOuterItemCount) + 1,外层索引从0开始,依次得到1、6、11、16 - 内层
childIterater计算:在当前外层元素的起始计数基础上,从2开始累加内层索引,确保子元素计数连续衔接
内容的提问来源于stack exchange,提问作者Mayur Tripathi
相关产品推荐
相关产品推荐

