You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:54:31