如何使用DataWeave对数组对象的同键值进行求和(首键保留)
满足需求的DataWeave脚本
需求概述
第一个键保持原样,其余键对应的值需进行求和运算,结果中对应值末尾必须保留斜杠“/”,且DataWeave脚本需具备动态性(无需硬编码字段名)。
输入示例
[ { "a": "40", "b": "60", "c": "20/" }, { "a": "40", "b": "10", "c": "10/" } ]
输出示例
[ { "a": "40", "b": "70", "c": "30/" } ]
DataWeave 2.0 脚本
%dw 2.0 output application/json --- payload // 按第一个字段的值分组,确保同组对象的第一个字段值一致 groupBy ((item) -> item[keysOf(item)[0]]) // 遍历分组,聚合生成目标对象 mapObject ((groupItems, groupKey) -> { // 保留第一个字段,直接使用分组键作为值 (keysOf(groupItems[0])[0]): groupKey, // 处理剩余所有字段:求和后添加末尾斜杠 (keysOf(groupItems[0])[1 to -1] map ((field) -> { (field): (groupItems sum ((item) -> // 移除输入值末尾的斜杠,转数字求和后再转回字符串并补斜杠 item[field] replace /\/$/ with "" as Number )) as String ++ "/" }) reduce ($$ ++ $)) }) // 将聚合后的对象转换为数组格式 pluck $
脚本说明
- 动态适配字段:通过
keysOf(item)[0]动态获取每个对象的第一个字段,keysOf(groupItems[0])[1 to -1]获取剩余所有字段,无需硬编码字段名(如a/b/c) - 值处理逻辑:先移除输入值末尾可能存在的斜杠,转换为数字完成求和,再转回字符串并强制添加斜杠,保证输出格式统一
- 分组聚合:基于第一个字段的值分组,确保所有同第一个字段值的对象都会被合并,自动处理多组场景(比如如果输入中有多个不同第一个字段值的对象,会分别聚合)
内容的提问来源于stack exchange,提问作者Mule-Newbie
相关产品推荐
相关产品推荐

