如何使用JQ合并两个数组的对应元素
按索引合并两个JSON数组的对象
要实现将第二个数组的键值对按索引位置整合到第一个数组的对应对象中,用jq可以轻松完成,以下是两种可行方案:
方案一:简洁的transpose+add组合
直接用jq的数组转置和对象合并功能,一行命令搞定:
jq -n '[inputs] | transpose | map(add)' 1.json 2.json
[inputs]:将两个输入的数组打包成一个包含两个元素的数组transpose:把这个二维数组转置,让原两个数组的同索引元素组成新的子数组map(add):对每个子数组里的两个对象执行合并操作,最终得到合并后的数组
方案二:显式索引遍历(更直观)
如果想更清晰地看到索引操作逻辑,可以用索引遍历的方式:
jq -n ' $arr1 := input | $arr2 := input | range($arr1 | length) as $idx | $arr1[$idx] + $arr2[$idx] | collect ' 1.json 2.json
- 先把两个输入数组赋值给变量
$arr1和$arr2 - 遍历数组的索引范围,对每个索引位置的两个对象执行
+操作(jq中对象+会合并键值对,重复键以后者为准,这里没有重复键,直接合并) collect把所有合并后的对象收集成数组
你原有命令的问题
你之前的命令里,map_values([.])把第一个数组的每个对象都包裹成了数组,后续的reduce操作只是把第二个数组的对象追加到这个数组里,而不是合并对象,所以才会出现两个独立对象的情况,而不是合并后的单个对象。
执行结果验证
运行上述任意命令后,都会得到你期望的结果:
[ { "name": "xxx", "url": "yyy", "thumbnail": "nnn", "spotifyUrl": "first-spotify-url" }, { "name": "bla bla", "url": "some-url", "thumbnail": "another-pic", "spotifyUrl": "second-spotify-url" } ]
内容的提问来源于stack exchange,提问作者marco79
相关产品推荐
相关产品推荐

