DataWeave 2.0 如何根据字段值移除数组内符合条件的条目
DataWeave 2.0 实现同name下chocolates正负值成对抵消移除
需求说明
按name字段分组,移除同一分组内所有chocolates值互为相反数的成对条目,剩余条目保留输出。
输入示例
[ { "name" : "ABC", "chocolates" : 5, "date" : "2021-01-01" }, { "name" : "ABC", "chocolates" : -5, "date" : "2021-01-02" }, { "name" : "ABC", "chocolates" : 15, "date" : "2021-01-03" }, { "name" : "DEF", "chocolates" : 7, "date" : "2021-01-01" } ]
期望输出
[ { "name" : "ABC", "chocolates" : 15, "date" : "2021-01-03" }, { "name" : "DEF", "chocolates" : 7, "date" : "2021-01-01" } ]
原有代码问题分析
你之前编写的嵌套reduce逻辑存在两处核心错误:
- 内层
reduce遍历未命中抵消规则时,没有将当前遍历项加入累加器,直接返回空的初始累加值,导致遍历过程中之前存储的有效条目全部丢失 - 命中抵消规则时,错误地将两个需要移除的抵消项都加入了结果集,没有实现移除逻辑
正确实现代码
实现思路:先按name分组,组内再按chocolates的绝对值二次分组,统计同绝对值下正数、负数的数量,按最小数量抵消后,保留剩余的条目即可。
%dw 2.0 output application/json // 处理单个name分组下的条目抵消逻辑 fun processGroup(items) = do { val absGrouped = items groupBy abs($.chocolates) absGrouped pluck ((sameAbsItems) -> do { val posItems = sameAbsItems filter $.chocolates > 0 val negItems = sameAbsItems filter $.chocolates < 0 val offset = min([sizeOf(posItems), sizeOf(negItems)]) // 抵消offset数量的正负条目,此处保留后出现的条目,需要保留先出现的可将drop改为take (posItems drop offset) ++ (negItems drop offset) }) } --- payload groupBy $.name pluck processGroup($) flatten
说明:如果抵消时需要优先保留更早出现的条目,将代码中
drop offset替换为take (sizeOf(posItems) - offset)和take (sizeOf(negItems) - offset)即可。
内容的提问来源于stack exchange,提问作者Bibek Kr. Bazaz
相关产品推荐
相关产品推荐

