如何使用jq合并两个JSON对象数组生成笛卡尔积结果
实现两个JSON对象数组笛卡尔积的jq方案
你之前使用的jq -s 'transpose | map(add)'逻辑是按索引对位合并元素,仅适合两个数组长度完全相等、需要一一对应合并的场景,无法生成全量组合的笛卡尔积,遇到数组长度不一致时甚至会直接报错。
正确命令
场景1:两个数组分别存储在独立JSON文件中
假设存放foo字段数组的文件为arr1.json,存放bar字段数组的文件为arr2.json,执行以下命令即可得到目标结果:
jq -n '[inputs[0][] as $item1 | inputs[1][] as $item2 | $item1 + $item2]' arr1.json arr2.json
场景2:两个数组已经被合并为一个二维数组传入
如果你的输入是一个长度为2的数组,第一个元素是foo数组、第二个元素是bar数组(比如用-s读取两个文件后的默认输出结构),可以使用以下命令:
jq '[.[0][] as $item1 | .[1][] as $item2 | $item1 + $item2]'
注意:对象合并时如果存在同名字段,后面的对象会覆盖前面的同名字段值,你可以根据自己的字段优先级调整
$item1和$item2的相加顺序。
逻辑说明
命令核心是做两层嵌套遍历:
- 第一层遍历第一个数组的所有对象,暂存为变量
- 第二层遍历第二个数组的所有对象,和第一层暂存的对象做合并
- 所有合并结果收集为新数组,就是你需要的笛卡尔积,输出结构完全匹配GitHub Actions矩阵的配置格式要求。
内容的提问来源于stack exchange,提问作者krak3n
相关产品推荐
相关产品推荐

