如何在DataWeave中基于ID从JSON数组提取指定字段?
如何用DataWeave根据键在另一个JSON数组中查找元素
你可以通过将查找数组转换为键值映射的方式,高效实现基于id的字段匹配,以下是具体解决方案:
完整DataWeave脚本
%dw 2.0 output application/json var lookupData = [ {"id": 1, "shortname": "John", "fullname": "John Doe", "age" : 40,"designation": "Engineer"}, {"id": 2, "shortname": "Mary", "fullname": "Mary Jane","age" : 36,"designation": "Manager"} ] // 将查找数组转为以id为键的映射,仅保留需要的字段 var lookupById = lookupData reduce ((item, acc) -> acc ++ {(item.id as String): { fullname: item.fullname, shortName: item.shortname // 匹配输出要求的字段名 }} ) --- payload map ((item) -> // 合并输入项与查找结果,无匹配id时返回空对象避免报错 item ++ lookupById[item.id as String] default {} )
关键逻辑说明
reduce转换查找结构:把原数组转成{"1": {fullname: "...", shortName: "..."}, "2": {...}}的键值对形式,通过id直接访问的时间复杂度为O(1),比每次用filter遍历数组的效率更高,尤其适合数据量较大的场景。map遍历输入负载:对每个输入项使用++运算符,合并原字段与查找得到的fullname、shortName字段。default {}容错处理:如果输入的id在查找数组中不存在,会返回空对象,避免出现null或运行报错。
输入输出验证
输入负载:
[{ "id": 1, "project": "ABC", "rate": "150" }, { "id": 2, "project": "ABC", "rate": "200" }]
输出结果:
[{ "id": 1, "project": "ABC", "rate": "150", "fullname": "John Doe", "shortName": "John" }, { "id": 2, "project": "ABC", "rate": "200", "fullname": "Mary Jane", "shortName": "Mary" }]
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

