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

如何使用JSONATA对JSON数据按指定Key分组并实现值求和?

使用JSONATA实现用户数据的分组求和

需求回顾

你需要对嵌套的用户数据按外层键(比如ADMIN、CUSTOMER)分组,同时对每个分组内的子键值对做求和操作。

输入数据

{"users": [ { "ADMIN": [ { "ADMIN_03": 46, "ADMIN_01": 2 } ], "CUSTOMER": [ { "CUSTOMER_01": 1 } ] }, { "ADMIN": [ { "ADMIN_03": 35 } ] }, { "ADMIN": [ { "ADMIN_01": 12 } ], "CUSTOMER": [ { "CUSTOMER_03": 2 } ] } ]}

期望输出

{"users": [ { "ADMIN":[ { "ADMIN_01": 14, "ADMIN_03": 81 } ], "CUSTOMER":[ { "CUSTOMER_01": 1, "CUSTOMER_03": 2 } ] } ]}

JSONATA 查询表达式

直接用这个表达式就能得到你想要的结果:

{
  "users": [
    $merge(
      users.*.(
        $each($, function($v, $k) {
          {
            $k: [
              $merge(
                $v.*.(
                  $each($, function($val, $subk) {
                    { $subk: $sum($val) }
                  })
                )
              )
            ]
          }
        })
      )
    )
  ]
}

表达式分步解释

我拆解一下这个表达式的逻辑,方便你理解:

  • 遍历外层用户数组:users.* 会把users数组里的每个对象展开处理。
  • 处理外层分组键:$each($, function($v, $k) 遍历每个用户对象的键值对,$k是外层分组名(比如ADMIN),$v是对应的子数组。
  • 内层子键求和:对于每个分组下的子数组,先用$v.*展开数组内的对象,再通过$each遍历子键(比如ADMIN_01),用$sum($val)对同一个子键的所有值求和,生成{子键: 求和值}的结构。
  • 合并结果:$merge会把同键名的结构合并在一起——比如把所有ADMIN下的子键求和结果合并成一个对象,再把外层的ADMIN和CUSTOMER结构合并成最终的用户对象。
  • 包装格式:最后把合并后的对象放到users数组里,完美匹配你要的输出结构。

你可以把输入数据和这个表达式放到JSONATA编辑器里测试,就能看到和期望一致的结果啦。

内容的提问来源于stack exchange,提问作者jukow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:12:45