DataWeave技术求助:按匹配键值合并对象数组并求和quantity
解决DataWeave数组对象合并求和问题
这问题我熟,用DataWeave的分组+聚合就能轻松搞定!
思路说明
核心逻辑就是先按指定维度分组,再对分组内的目标字段求和:
- 用
groupBy把item和code组合作为唯一标识,将相同组合的对象归为一组 - 对每个分组里的
quantity字段做累加计算(注意要先处理类型转换,因为输入的quantity是字符串) - 最后把分组后的键值对结构转回数组,得到最终格式
DataWeave 2.0 实现代码
%dw 2.0 output application/json --- // 1. 按item+code的组合分组,用|做分隔符避免键冲突 payload groupBy ((obj) -> obj.item ++ "|" ++ obj.code) // 2. 遍历每个分组,合并对象并计算quantity总和 mapValues ((groupedItems) -> { item: groupedItems[0].item, code: groupedItems[0].code, // 把字符串类型的quantity转成数字累加,再转回字符串保持格式一致 quantity: (groupedItems reduce ((item, total = 0) -> total + item.quantity as Number)) as String }) // 3. 把分组的键值对结构转成数组 pluck ($)
代码关键细节解释
- 分组键设计:
obj.item ++ "|" ++ obj.code用分隔符拼接两个字段,能避免不同字段组合却生成相同键的冲突(比如item="12"+code="ABC"和item="1"+code="2ABC"的情况) - 求和逻辑:用
reduce遍历分组内的每个对象,逐步累加quantity值。因为输入的quantity是字符串类型,必须先转成Number才能计算,最后转回String是为了和输入的字段格式保持一致 - 数组转换:
groupBy返回的是键值对对象,用pluck ($)可以提取所有值并组成数组,正好匹配我们需要的输出结构
验证结果
把你提供的输入代入这段代码,就能得到完全符合期望的输出:
[ { "item": "1", "quantity": "300", "code":"ABC" }, { "item": "1", "quantity": "200", "code":"CDB" }, { "item": "12", "quantity": "200", "code":"ABC" } ]
内容的提问来源于stack exchange,提问作者SP-
相关产品推荐
相关产品推荐

