求助:使用Jsonata将扁平结构转换为树形层级结构
扁平数据转树形结构的Jsonata表达式实现
需求说明
需要编写Jsonata表达式,将以下扁平结构数据转换为指定的树形层级结构:
扁平结构数据
[ { "Id": 1, "ParentId": 0 }, { "Id": 2, "ParentId": 1 }, { "Id": 3, "ParentId": 1 }, { "Id": 4, "ParentId": 1 }, { "Id": 5, "ParentId": 2 }, { "Id": 6, "ParentId": 2 }, { "Id": 7, "ParentId": 2 }, { "Id": 8, "ParentId": 3 }, { "Id": 9, "ParentId": 4 } ]
目标树形层级结构
{ "Id": 0, "child" : [ { "Id": 1, "child" : [ { "Id": 2, "child" : [ {"Id": 5}, {"Id": 6}, {"Id": 7} ] }, { "Id": 3, "child" : [ {"Id": 8} ] }, { "Id": 4, "child" : [ {"Id": 9} ] } ] } ] }
实现表达式
{ "Id": 0, "child": $map($filter($$, function($v) { $v.ParentId = 0 }), function($item) { $merge([ $item ~> |$| {"ParentId": null}|, {"child": $tree($item.Id)} ]) }) } $tree($parentId) := $map($filter($$, function($v) { $v.ParentId = $parentId }), function($item) { $merge([ $item ~> |$| {"ParentId": null}|, $count($filter($$, function($v) { $v.ParentId = $item.Id })) > 0 ? {"child": $tree($item.Id)} : {} ]) })
表达式说明
- 顶层构造根节点
Id:0,筛选出ParentId=0的节点作为直接子节点 - 定义递归函数
$tree($parentId):- 筛选所有
ParentId匹配传入值的节点 - 移除节点的
ParentId字段,若该节点存在子节点,则递归调用$tree生成子节点列表 - 通过
$merge合并节点属性与子节点列表,匹配目标结构
- 筛选所有
内容的提问来源于stack exchange,提问作者Jeff Tapia
相关产品推荐
相关产品推荐

