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

修改GitHub CLI GraphQL响应的JQ过滤器,实现指定输出格式

问题:调整GitHub GraphQL分页结果的jq查询格式

背景

我正在创建GitHub Action工作流,调用GitHub CLI的GraphQL API请求,gh api graphql通过--paginate分页返回JSON Lines(ndjson)。现有jq查询的输出不符合预期,需要调整。

输出格式需求

  • 期望输出:单个对象包含所有键值对的数组
[
  {
    "KEY": "VALUE",
    "KEY": "VALUE",
    ...
  }
]
  • 当前输出:每个键值对单独成对象的数组
[
  {
    "KEY": "VALUE"
  },
  {
    "KEY": "VALUE"
  },
  ...
]

过滤条件

仅保留满足以下条件的里程碑:

  • 进度为100%
  • 标题不含"withdrawn"字样
  • 关联有issues

额外处理规则

若里程碑标题包含空格或, ,需拆分标题,每个拆分后的内容作为独立键,对应相同的issues数据值。

当前jq查询(需修改)

.[] | .data.repository as {
    nameWithOwner: $name, 
    milestones: { 
        nodes: $milestones
    }
}
| [
    foreach $milestones[] as $milestone (
        null; $milestone ; 
        $milestone
        | select($milestone.progressPercentage == 100)
        | select($milestone.title | contains("withdrawn") | not)
        | select($milestone.issues.nodes[])
        |
        {
            (($milestone.title | gsub(", "; " ") | split(" "))[]) : 
            [
                foreach $milestone.issues.nodes[] as $issue (
                    {}; . + { $issue };
                    $issue as $issue | $issue
                    | (reduce $issue.labels.nodes[] as $item ([]; . + [$item.name])) as $labels
                    |
                    {
                        repo: $name,
                        issue: $issue.number,
                        milestone: $milestone.number,
                        labels: $labels
                    }
                    
                )
            ]
        }
    )
]
| .

示例输入(JSON片段)

{
  "data": {
    "repository": {
      "nameWithOwner": "cov-lineages/pango-designation",
      "milestones": {
        "pageInfo": {
          "hasNextPage": true,
          "endCursor": "Y3Vyc29yOnYyOpHOAGviZA=="
        },
        "nodes": [
          {
            "number": 1,
            "title": "C.1, EXAMPLE_SPLIT",
            "progressPercentage": 100,
            "issues": {
              "nodes": [
                {
                  "number": 2,
                  "labels": {
                    "nodes": [
                      {
                        "name": "proposed"
                      },
                      {
                        "name": "designated"
                      }
                    ]
                  }
                }
              ]
            }
          },
          {
            "number": 2,
            "title": "B.1.429",
            "progressPercentage": 100,
            "issues": {
              "nodes": [
                {
                  "number": 3,
                  "labels": {
                    "nodes": [
                      {
                        "name": "proposed"
                      },
                      {
                        "name": "designated"
                      }
                    ]
                  }
                }
              ]
            }
          }
        ]
      }
    }
  }
}

预期示例输出

应生成包含3个键值对的单个对象数组:

[
  {
    "C.1": [
      {
        "repo": "cov-lineages/pango-designation",
        "issue": 2,
        "milestone": 1,
        "labels": ["proposed", "designated"]
      }
    ],
    "EXAMPLE_SPLIT": [
      {
        "repo": "cov-lineages/pango-designation",
        "issue": 2,
        "milestone": 1,
        "labels": ["proposed", "designated"]
      }
    ],
    "B.1.429": [
      {
        "repo": "cov-lineages/pango-designation",
        "issue": 3,
        "milestone": 2,
        "labels": ["proposed", "designated"]
      }
    ]
  }
]

修改后的jq查询

核心调整是将多个独立对象合并为单个对象,使用add操作符简化逻辑,同时保留所有过滤和拆分规则:

.[] | .data.repository as {nameWithOwner: $name, milestones: {nodes: $milestones}}
# 先预处理所有符合条件的issues数据
| $milestones
| map(
    select(.progressPercentage == 100)
    | select(.title | contains("withdrawn") | not)
    | select(.issues.nodes | length > 0)
    | .issues.nodes[] 
    | (reduce .labels.nodes[] as $item ([]; . + [$item.name])) as $labels
    | {
        repo: $name,
        issue: .number,
        milestone: $milestone.number,
        labels: $labels
      }
  ) as $allIssues
# 处理里程碑标题拆分并构建最终对象
| $milestones
| map(
    select(.progressPercentage == 100)
    | select(.title | contains("withdrawn") | not)
    | select(.issues.nodes | length > 0)
    | (
        .title | gsub(", "; " ") | split(" ") as $keys
        | $keys | map({
            (.): $allIssues | select(.milestone == $milestone.number)
          }) | add
      )
  ) | add | [.]

内容的提问来源于stack exchange,提问作者Christopher Rucinski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:30:55