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

解析嵌套数组时出现意外笛卡尔积问题(jq工具)

解决jq解析嵌套数组时产生笛卡尔积的问题

我在用jq工具解析包含嵌套数组的JSON数据,想要提取特定属性,但当前写法生成了所有可能值的笛卡尔积,没能得到嵌套数组的正确结构。

当前使用的jq命令

jq '.[] | {id, versions: (.versions[] | {id}) }'

源数据

[{
  "id": "afe45456-18fd-4523-a0ee-b7ed9d0a308e",
  ***,
  "versions": [{
    "id": "07e34a2d-be28-4925-afdd-79ddcbe54db9",
    ***
  },
  {
    "id": "0e4ea89c-49da-4f79-a6bc-eec0dad19133",
    ***
  }],
  ***
},
{
  "id": "3644e592-c9c3-4c3b-b6d4-e6a7dbdf80fb",
  ***,
  "versions": [{
    "id": "9d63e112-7c42-43fa-b460-3f4389b691b3",
    ***
  }],
  ***
}]

预期输出

[{
  "id": "afe45456-18fd-4523-a0ee-b7ed9d0a308e",
  "versions": [{
    "id": "07e34a2d-be28-4925-afdd-79ddcbe54db9"
  },
  {
    "id": "0e4ea89c-49da-4f79-a6bc-eec0dad19133"
  }]
},
{
  "id": "3644e592-c9c3-4c3b-b6d4-e6a7dbdf80fb",
  "versions": [
  {
    "id": "9d63e112-7c42-43fa-b460-3f4389b691b3"
  }]
}]

实际输出(笛卡尔积现象)

{
  "id": "afe45456-18fd-4523-a0ee-b7ed9d0a308e",
  "versions": {
    "id": "07e34a2d-be28-4925-afdd-79ddcbe54db9"
  }
}
{
  "id": "afe45456-18fd-4523-a0ee-b7ed9d0a308e",
  "versions": {
    "id": "0e4ea89c-49da-4f79-a6bc-eec0dad19133"
  }
}
{
  "id": "3644e592-c9c3-4c3b-b6d4-e6a7dbdf80fb",
  "versions": {
    "id": "9d63e112-7c42-43fa-b460-3f4389b691b3"
  }
}

解决方案

方法1:用数组包裹嵌套元素处理结果

将.versions[]的处理结果用[]包裹,确保生成数组而非单个对象,最后再用[]收集所有外层对象为数组:

jq '[ .[] | {id, versions: [.versions[] | {id}]} ]'

方法2:使用map函数简化处理

map函数可直接遍历数组并处理每个元素,写法更简洁:

jq 'map({id, versions: .versions | map({id})})'

原因说明

原命令中.versions[]会将嵌套数组展开为独立元素,每个元素都会和外层id生成单独对象,从而产生笛卡尔积。通过[.versions[] | {id}]或.versions | map({id}),可将处理后的元素重新组合为数组,保留原有嵌套结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:38:13