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

MuleSoft DataWeave:合并同键不同对象的键值对

问题描述

我有一个对象数组格式的Payload,每个对象中包含一个值为对象数组的键。我需要合并所有匹配的键,并将最底层的值浓缩为一个数组。

示例Payload:

[
    {
        "randomNumbers": [
            {
                "aFewDigits": "124374"
            }
        ]
    },
    {
        "randomNumbers": [
            {"aFewDigits": "103865"},
            {"aFewDigits": "103868"},
            {"aFewDigits": "103739"},
            {"aFewDigits": "103866"}
        ]
    },
    {
        "randomNumbers": [
            {"aFewDigits": "103864"},
            {"aFewDigits": "103737"},
            {"aFewDigits": "103862"},
            {"aFewDigits": "103860"}
        ]
    }
]

我尝试了以下DataWeave映射脚本提取值:

%dw 2.0
output application/json
---
payload map{
    aFewDigits: $..aFewDigits
}

得到的结果是:

[
  {
    "aFewDigits": [
      "124374"
    ]
  },
  {
    "aFewDigits": [
      "103865",
      "103868",
      "103739",
      "103866"
    ]
  },
  {
    "aFewDigits": [
      "103864",
      "103737",
      "103862",
      "103860"
    ]
  }
]

而我期望的结果是:

[
  {
    "aFewDigits": [
      "124374",
      "103865",
      "103868",
      "103739",
      "103866",
      "103864",
      "103737",
      "103862",
      "103860"
    ]
  }
]
解决方案

你之前的脚本用map遍历了Payload里的每个对象,所以每个对象都会生成一个包含aFewDigits数组的新对象,最终得到多个对象组成的数组。要实现合并所有值的需求,推荐两种简洁的实现方式:

方式一:深度选择器+扁平化

%dw 2.0
output application/json
---
[{
    aFewDigits: payload..aFewDigits flatten
}]
  • payload..aFewDigits:用深度选择器(..)递归提取所有层级的aFewDigits值,得到嵌套数组
  • flatten:将嵌套数组转为一维数组,把所有子元素合并到同一个数组中
  • 外层[{ }]将结果封装为单对象数组,匹配期望结构

方式二:明确遍历数组

%dw 2.0
output application/json
---
[{
    aFewDigits: payload flatMap $.randomNumbers map $.aFewDigits
}]
  • payload flatMap $.randomNumbers:遍历每个对象,提取randomNumbers数组并扁平化,得到所有含aFewDigits的对象集合
  • map $.aFewDigits:遍历上述集合,提取每个对象的aFewDigits值,最终得到一维数组

内容的提问来源于stack exchange,提问作者ndtorre

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:39