如何编写JSONata查询,按唯一job属性汇总issuesInJob值?
问题:按job去重汇总JSON数组中的issuesInJob值
简化后的JSON数组
[ { "job":1, "issue":"red", "issuesInJob":50 }, { "job":1, "issue":"blue", "issuesInJob":50 }, { "job":2, "issue":"orange", "issuesInJob":20 }, { "job":2, "issue":"orange", "issuesInJob":20 }, { "job":3, "issue":"green", "issuesInJob":20 } ]
数组说明
- 数组包含不同编号的
job,每个对象代表该job下的一种issue类型,同一job可能存在多个甚至重复的issue对象 issuesInJob是对应job的总issue数量,比如job 1的该值为50,意味着数组中有50个job:1的对象
预期输出
需要汇总所有job的issuesInJob值,每个job的数值仅统计一次(即使不同job的数值相同也要分别计入)。示例数组的求和结果应为:50 + 20 + 20 = 90
之前尝试对唯一的issuesInJob值求和,但因为不同job可能有相同值导致结果错误,且无法修改原数组结构,需基于现有结构实现需求。
JSONata解决方案
使用以下JSONata表达式即可实现需求:
sum($distinct($map($groupBy($, 'job'), function($v, $k) { $v[0].issuesInJob })))
表达式解释
$groupBy($, 'job'):将数组按job字段分组,每个分组对应一个job的所有对象$map(..., function($v, $k) { $v[0].issuesInJob }):遍历每个分组,取分组中第一个对象的issuesInJob值(同一job的该值完全一致)$distinct(...):确保每个job的数值只保留一次(分组后已天然唯一,此步可作为兜底验证)sum(...):对处理后的唯一数值数组求和
也可以用更简洁的写法,直接遍历分组取对应值求和:
sum($each($groupBy($, 'job'), function($group) { $group[0].issuesInJob }))
内容的提问来源于stack exchange,提问作者ceid1987
相关产品推荐
相关产品推荐

