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

如何用YQ将含双数组属性的简单对象展开为对象数组?

使用yq将含数组属性的YAML对象展开为对象数组

需求说明

现有一个包含两个数组属性的YAML对象,需要将两个数组做笛卡尔积展开,转换为多个对象组成的数组,每个对象包含原对象的非数组属性,以及两个数组各取一个元素的对应属性。

输入YAML示例

name: a
spaces:
  - alpha
  - beta
envs:
  - dev
  - test
  - prod

期望输出

- name: a
  space: alpha
  env: dev
- name: a
  space: alpha
  env: test
- name: a
  space: alpha
  env: prod
- name: a
  space: beta
  env: dev
- name: a
  space: beta
  env: test
- name: a
  space: beta
  env: prod

解决方案(分yq版本)

1. mikefarah/yq(v4+,主流版本)

使用对象合并操作符*结合数组展开,自动生成笛卡尔积:

yq '{"name": .name} * ({"space": .spaces[]} * {"env": .envs[]})' input.yaml

命令解释:

  • {"name": .name}:提取原对象的name属性,生成基础对象
  • {"space": .spaces[]}:将spaces数组展开为多个仅含space字段的对象
  • {"env": .envs[]}:将envs数组展开为多个仅含env字段的对象
  • *:合并对象时,若操作数为数组会自动生成所有组合的笛卡尔积,最终输出符合要求的对象数组

2. kislyuk/yq(Python版)

通过显式遍历数组元素生成目标对象:

yq -n 'load("input.yaml") as $doc | $doc.name as $name | $doc.spaces[] as $space | $doc.envs[] as $env | {"name": $name, "space": $space, "env": $env}'

命令解释:

  • -n:启用空输入模式,手动加载文件
  • load("input.yaml") as $doc:加载输入YAML文档并赋值给变量$doc
  • $doc.spaces[] as $space:遍历spaces数组的每个元素
  • $doc.envs[] as $env:遍历envs数组的每个元素
  • 最后组合name、space、env生成每个目标对象,遍历过程会自动生成所有组合

内容的提问来源于stack exchange,提问作者Kees C. Bakker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:31:14