You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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})

逻辑说明:

  1. 两层map结合flatten提取所有子项,生成仅包含PNR和Color的数组
  2. 对扁平化后的数组再次执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:30:25