如何用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
代码说明
flatMap:遍历data数组的每个元素,将每个元素的specialtyIds数组展开,避免生成嵌套数组。map { id: $ }:把每个specialtyId字符串转换为{id: "..."}的对象结构。distinctBy $.id:根据id字段去重,确保最终数组中每个id唯一。
也可以写成更直观的形式:
payload.data flatMap (item) -> item.specialtyIds map { id: $ } distinctBy $.id
内容的提问来源于stack exchange,提问作者Matt P
相关产品推荐
相关产品推荐

