如何将带有 "categories" 和 "subcategories" 的平面对象数组转换为带有 JQ 的树?

How to convert flat array of objects with "categories" and "subcategories" to tree with JQ?

我有一个 JSON 包含组和子组的对象数组,如下所示:

[
  {
    "Group name": "Elevation", 
    "Subgroup": "Contours", 
    "name": "Contours - Labels"
  }, 
  {
    "Group name": "Elevation", 
    "Subgroup": "Contours", 
    "name": "Contours"
  }, 
  {
    "Group name": "Elevation", 
    "Subgroup": "Cuttings", 
    "name": "Cuttings"
  },
  {
    "Group name": "Framework", 
    "Subgroup": "Reserves", 
    "name": "Reserves"
  }, 
  {
    "Group name": "Framework", 
    "Subgroup": "Indigenous Reserves", 
    "name": "Reserves"
  }, 
  {
    "Group name": "Framework", 
    "Subgroup": "Land Borders", 
    "name": "Mainland"
  }
]

我想将其转换为嵌套结构:

[ { type: group, name: Elevation, Items: [ ... ] } ]

JQ 是怎么做到的?

这完成了工作:

def subgroups:
group_by(."Subgroup")|
map({
  "type": "group", 
  "name": .[0]."Subgroup", 
  "items": (map(del(.Subgroup)))
});

group_by(."Group name")|
map({
  "type": "group", 
  "name": .[0]."Group name", 
  "items": (subgroups2|map(del(."Group name")))
})

只是两次相同的过程:

  1. group_by 对 "group name"
  2. 上的外部项目进行排序
  3. 对于这些组中的每一个,构造一个对象,其名称取自第一个项目,其项目是...
  4. 传递给重复 1 和 2 的函数,并删除分组字段。

我不确定您的预期输出到底是什么,但这可以更有效地完成。通过参数化分组函数,您可以以可重用的方式构建树。

def regroup(keyfilter; itemfilter):
    group_by(keyfilter) | map({
        type: "group",
        name: (.[0] | keyfilter),
        items: itemfilter
    })
    ;
regroup(."Group name";
    regroup(.Subgroup;
        map({ name })
    )
)

这会产生以下结果:

[
  {
    "type": "group",
    "name": "Elevation",
    "items": [
      {
        "type": "group",
        "name": "Contours",
        "items": [
          { "name": "Contours - Labels" },
          { "name": "Contours" }
        ]
      },
      {
        "type": "group",
        "name": "Cuttings",
        "items": [
          { "name": "Cuttings" }
        ]
      }
    ]
  },
  {
    "type": "group",
    "name": "Framework",
    "items": [
      {
        "type": "group",
        "name": "Indigenous Reserves",
        "items": [
          { "name": "Reserves" }
        ]
      },
      {
        "type": "group",
        "name": "Land Borders",
        "items": [
          { "name": "Mainland" }
        ]
      },
      {
        "type": "group",
        "name": "Reserves",
        "items": [
          { "name": "Reserves" }
        ]
      }
    ]
  }
]

功能很强大,大家要多多利用。希望这能展示它的强大之处。