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

求助:使用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):
    1. 筛选所有ParentId匹配传入值的节点
    2. 移除节点的ParentId字段,若该节点存在子节点,则递归调用$tree生成子节点列表
    3. 通过$merge合并节点属性与子节点列表,匹配目标结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:36:10