如何用jq将父节点字段映射到子节点并跳过空数组?
使用jq处理GitHub GraphQL Release资产的高效实现方式
核心实现命令
直接使用以下jq表达式即可完成需求,兼顾效率和简洁性:
.releases.nodes[] | select(.releaseAssets.nodes | length > 0) | .releaseAssets.nodes[] | . + {tagName: ../tagName, date: ../publishedAt}
分步解释
.releases.nodes[]:遍历所有release节点select(.releaseAssets.nodes | length > 0):过滤掉没有资产文件的release(跳过releaseAssets.nodes为空的条目).releaseAssets.nodes[]:遍历当前release下的所有资产节点. + {tagName: ../tagName, date: ../publishedAt}:将父级release的tagName和发布时间(映射为需求中的date字段)合并到每个资产对象中
输出为JSON数组(可选)
如果需要将结果整理为单个JSON数组而非流式输出,在外层包裹数组构造器即可:
[ .releases.nodes[] | select(.releaseAssets.nodes | length > 0) | .releaseAssets.nodes[] | . + {tagName: ../tagName, date: ../publishedAt} ]
示例验证
输入示例(GitHub GraphQL返回结构)
{ "releases": { "nodes": [ { "tagName": "v1.0.0", "publishedAt": "2023-01-01T00:00:00Z", "releaseAssets": { "nodes": [ { "name": "app-linux.zip", "downloadUrl": "https://example.com/app-linux.zip" }, { "name": "app-windows.exe", "downloadUrl": "https://example.com/app-windows.exe" } ] } }, { "tagName": "v1.0.1", "publishedAt": "2023-01-05T00:00:00Z", "releaseAssets": { "nodes": [] } }, { "tagName": "v1.1.0", "publishedAt": "2023-02-01T00:00:00Z", "releaseAssets": { "nodes": [ { "name": "app-macos.dmg", "downloadUrl": "https://example.com/app-macos.dmg" } ] } } ] } }
输出示例
{ "name": "app-linux.zip", "downloadUrl": "https://example.com/app-linux.zip", "tagName": "v1.0.0", "date": "2023-01-01T00:00:00Z" } { "name": "app-windows.exe", "downloadUrl": "https://example.com/app-windows.exe", "tagName": "v1.0.0", "date": "2023-01-01T00:00:00Z" } { "name": "app-macos.dmg", "downloadUrl": "https://example.com/app-macos.dmg", "tagName": "v1.1.0", "date": "2023-02-01T00:00:00Z" }
效率说明
该实现采用jq的流式处理模型,仅做必要的遍历与筛选操作,无冗余计算,能够高效处理大体积的GitHub GraphQL返回数据。
内容的提问来源于stack exchange,提问作者luckman212
相关产品推荐
相关产品推荐

