如何在MuleSoft DataWeave中为多层级数组生成递增ID
问题
处理多层级数组转换时,如何为字段ID分配连续递增的值?
输入数据:
[ { "productNo": "00011111", "items": [ { "color": "000000000006000060", }, { "color": "000000000006000061", } ] }, { "productNo": "00022222", "items": [ { "color": "000000000006000060" }, { "color": "000000000006000061" } ] } ]
尝试的DataWeave代码:
%dw 2.0 output application/json --- flatten(payload map (item, index) -> item.items map (subItem, subIndex) -> { "ID": subIndex, "PNR": item.productNo, "Color": subItem.color })
期望输出:
[ { "ID": 1, "PNR": "00011111", "Color": "000000000006000060" }, { "ID": 2, "PNR": "00011111", "Color": "000000000006000061" }, { "ID": 3, "PNR": "00022222", "Color": "000000000006000060" }, { "ID": 4, "PNR": "00022222", "Color": "000000000006000061" } ]
原代码中subIndex会在外层每次迭代时重置为0,无法生成连续递增的ID,需要修改实现连续ID的逻辑。
解决方案
方法一:扁平化后统一生成ID
先将所有子项扁平化处理,再利用全局索引生成连续ID,逻辑更简洁:
%dw 2.0 output application/json --- flatten(payload map (item) -> item.items map (subItem) -> { "PNR": item.productNo, "Color": subItem.color }) map ((item, index) -> item ++ {ID: index + 1})
逻辑说明:
- 两层
map结合flatten提取所有子项,生成仅包含PNR和Color的数组 - 对扁平化后的数组再次执行
map,利用全局索引(从0开始)加1得到从1起始的连续ID,通过++合并字段到对象中
方法二:外层累加前置项数量
在外层迭代时计算当前项之前所有子项的总数,结合内层索引得到全局ID:
%dw 2.0 output application/json --- flatten(payload map (item, outerIndex) -> item.items map (subItem, innerIndex) -> { "ID": (payload[0 to outerIndex - 1] sum $.items.size()) + innerIndex + 1, "PNR": item.productNo, "Color": subItem.color } )
逻辑说明:
payload[0 to outerIndex - 1] sum $.items.size():计算当前外层项之前所有外层项的子项总数量- 加上当前内层索引再加1,得到从1开始的全局连续ID
内容的提问来源于stack exchange,提问作者Magda
相关产品推荐
相关产品推荐

