我正在使用JQPlay播放格式。我不明白如何使用归约子结构。我想根据组织或父ID进行分组。
仅更新我的jqplay过滤器,但无法删除两个按ID分组的标签。
我在jqplay.org中使用以下语法。还可以请您提出如何在管道符号后调试任何东西的方法。
.items | {"org" : map( {id : .org, orgProperties : [{"properties" : {"methodId" : [{"id" : .methodId}]}}]})| group_by(.id) | map( reduce .[] as $x (.[0]|{}; .orgProperties+= ($x | .orgProperties)))}
{
"items": [
{
"org": "750141",
"methodId": "1-10F7IAK7"
},
{
"org": "750141",
"methodId": "1-10TP18L0"
},
{
"org": "750142",
"methodId": "1-10TP18L1"
}
]
}
{
"org": [
{
"orgProperties": [
{
"properties": {
"methodId": [
{
"id": "1-10F7IAK7"
}
]
}
},
{
"properties": {
"methodId": [
{
"id": "1-10TP18L0"
}
]
}
}
]
},
{
"orgProperties": [
{
"properties": {
"methodId": [
{
"id": "1-10TP18L1"
}
]
}
}
]
}
]
}
{
"org": [
{
"id": "750141",
"orgProperties": [
{
"properties": {
"methodId": [
{
"id": "1-10F7IAK7"
},
{
"id": "1-10TP18L0"
}
]
}
}
]
},
{
"id": "750142",
"orgProperties": [
{
"properties": {
"methodId": [
{
"id": "1-10TP18L1"
}
]
}
}
]
}
]
}
答案 0 :(得分:2)
您需要执行以下操作。您需要先group_by()
,然后再进行处理
jq '.items | {org: group_by(.org) | map({id: .[0].org, orgProperties: [{properties: { methodId: map({id: .methodId}) }}]})} ' input.json
我认为没有办法提高jq
抛出的调试详细级别,除非可能会修改代码以添加自己的调试语句并运行自定义构建。
我个人一次从一个组件构建过滤器,观察其输出并在此之上进行操作。破坏以上功能
'.items | {org: ..
部分之后完全重建了JSON。后续部分的结果构成了预期输出最高"org"
部分之下的内容。group_by(.org)
后,您将获得一个包含两个数组条目的结果,一个包含2个对象(id 750141
),另一个包含单个对象(id 750142
) 。 map(..)
中运行代码到上一步返回的对象列表中我们在最终结果中仅需要唯一的键名称,因此我们仅在第一个数组中使用.[0].org
。即使您有多个重复的键名称,此功能也可以使用。暂停直到现在为止看看输出
{
"org": [
{
"id": "750141"
},
{
"id": "750142"
}
]
}
现在使用orgProperties: [{properties: { methodId: ...
构造其余的输出,该子目录创建为
"orgProperties": [
{
"properties": {
"methodId":
使用map({id: .methodId})
创建最终的子数组,以创建具有ID列表的键值对