使用jq转换JSON结构时如何避免生成笛卡尔积
正确jq命令方案
你可以用transpose对两个数组按索引配对,避免分别展开产生笛卡尔积,命令如下:
jq '.[0] | [.x, .y] | transpose | map({a: .[0], b: .[1]})'
命令逻辑说明
.[0]取出外层数组中的第一个元素对象[.x, .y]将x、y两个数组合并为二维数组结构transpose对二维数组按列转置,得到[[x1,y1],[x2,y2],[x3,y3]]的配对结构map({a: .[0], b: .[1]})将每一组配对值转换为要求的key结构
如果你的输入外层数组可能包含多个待转换对象,可以使用适配多元素的版本:
jq 'map([.x, .y] | transpose | map({a: .[0], b: .[1]})) | add'
原命令错误原因
你原来的写法中.x[]和.y[]是分别迭代展开的,每一个x数组的元素都会匹配所有y数组的元素,因此生成了9条笛卡尔积结果。
内容的提问来源于stack exchange,提问作者aborruso
相关产品推荐
相关产品推荐

