如何将带有 "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")))
})
只是两次相同的过程:
group_by
对 "group name" 上的外部项目进行排序
- 对于这些组中的每一个,构造一个对象,其名称取自第一个项目,其项目是...
- 传递给重复 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" }
]
}
]
}
]
功能很强大,大家要多多利用。希望这能展示它的强大之处。
我有一个 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")))
})
只是两次相同的过程:
group_by
对 "group name" 上的外部项目进行排序
- 对于这些组中的每一个,构造一个对象,其名称取自第一个项目,其项目是...
- 传递给重复 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" }
]
}
]
}
]
功能很强大,大家要多多利用。希望这能展示它的强大之处。