如何使用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
相关产品推荐
相关产品推荐

