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

如何用DataWeave将JSON嵌套数组转为去重的对象数组?

问题:提取并去重specialtyIds数组

输入Payload

{
  "data": [
    {
      "id": "f251f05f-038c-4c26-bf7c-3b2fc47210e6",
      "specialtyIds": [
        "20c5f3f0-54c9-4779-b1a3-19baeee91b4a"
      ]
    },
    {
      "id": "61d34a84-940d-4556-9c4b-ef7bede9caca",
      "specialtyIds": [
        "20c5f3f0-54c9-4779-b1a3-19baeee91b4a",
        "9834e1cf-94c4-4188-83e6-867ac1d60017",
        "30d6g4d3-54c9-4779-b1a3-19baeee92cdc"
      ]
    }
  ]
}

期望输出

[
  {
    "id": "20c5f3f0-54c9-4779-b1a3-19baeee91b4a"
  }, 
  {
    "id": "9834e1cf-94c4-4188-83e6-867ac1d60017"
  },
  {
    "id": "30d6g4d3-54c9-4779-b1a3-19baeee92cdc"
  }
]

原脚本问题

原脚本用joinBy(",")把多个specialtyId拼接成单字符串,导致多元素数组被合并成一个值,无法拆分出单个id:

payload.data map {
    id: $.specialtyIds joinBy(",")
} distinctBy $

错误输出结果:

[
  {
    "id": "20c5f3f0-54c9-4779-b1a3-19baeee91b4a"
  }, 
  {
    "id": "20c5f3f0-54c9-4779-b1a3-19baeee91b4a,9834e1cf-94c4-4188-83e6-867ac1d60017"
  }
]

简洁解决方案

使用flatMap展开所有嵌套的specialtyIds数组,再映射为目标对象格式,最后去重:

payload.data flatMap ($.specialtyIds map { id: $ }) distinctBy $.id

代码说明

  1. flatMap:遍历data数组的每个元素,将每个元素的specialtyIds数组展开,避免生成嵌套数组。
  2. map { id: $ }:把每个specialtyId字符串转换为{id: "..."}的对象结构。
  3. distinctBy $.id:根据id字段去重,确保最终数组中每个id唯一。

也可以写成更直观的形式:

payload.data flatMap (item) -> item.specialtyIds map { id: $ } distinctBy $.id

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:25:29