如何使用Jsonata按srno、name分组聚合resources的projects列表?
按srno和name分组并合并projects的Jsonata表达式
需求
将输入JSON中resources数组的元素按srno和name字段分组,合并同一分组下的projects列表,同时保留无projects字段的条目。
输入JSON
{"resources":[{"srno":"1","name":"name1","projects":[{"prjname":"abc"}]},{"srno":"1","name":"name1","projects":[{"prjname":"def"}]},{"srno":"2","name":"name2","projects":[{"prjname":"abc"}]},{"srno":"4","name":"name4","projects":[{"prjname":"prq"}]},{"srno":"4","name":"name4","projects":[{"prjname":"stu"}]},{"srno":"4","name":"name4","projects":[{"prjname":"uvw"}]},{"srno":"5","name":"name5"}]}
目标输出JSON
{"resources":[{"srno":"1","name":"name1","projects":[{"prjname":"abc"},{"prjname":"def"}]},{"srno":"2","name":"name2","projects":[{"prjname":"abc"}]},{"srno":"4","name":"name4","projects":[{"prjname":"prq"},{"prjname":"stu"},{"prjname":"uvw"}]},{"srno":"5","name":"name5"}]}
Jsonata表达式
{ "resources": $map( $groupBy(resources, function($v) { $v.srno & "|" & $v.name }), function($group, $key) { { "srno": $split($key, "|")[0], "name": $split($key, "|")[1], "projects": $flatten($group.projects) } ~> $filter(function($v, $k) { $exists($v) }) } ) }
表达式说明
$groupBy(resources, function($v) { $v.srno & "|" & $v.name }):通过srno与name拼接的唯一键,对resources数组进行分组$map(...):遍历每个分组,生成最终的结构化条目$split($key, "|")[0]/[1]:从分组键中拆分出原始的srno和name值$flatten($group.projects):将分组内所有projects子数组合并为一个扁平数组~> $filter(function($v, $k) { $exists($v) }):自动过滤不存在的字段(例如分组内无projects时,该字段会被移除)
内容的提问来源于stack exchange,提问作者Amit Chauhan
相关产品推荐
相关产品推荐

