如何在不使用数组索引的情况下复制JSON对象属性(jq实现)
不依赖数组顺序的jq字段赋值方法
输入数据
{ "zoo": [ { "x": { "guesst": "" } }, { "y": { "guesst": "zebra" } } ] }
目标输出
{ "zoo": [ { "x": { "guesst": "zebra" } }, { "y": { "guesst": "zebra" } } ] }
你当前使用的命令依赖数组索引的固定顺序:
jq '.zoo[0].x.guesst = .zoo[1].y.guesst'
如果无法确定数组中对象的顺序,可以用以下两种方式实现需求:
通用方案(适配任意键名/顺序)
先提取出guesst字段的非空有效值,再遍历数组给所有guesst字段赋值:
jq '($validValue = .zoo[] | .[] | .guesst | select(length > 0)) | .zoo[] | .[] | .guesst = $validValue'
逻辑说明:
- 从
zoo数组的所有对象中,筛选出guesst不为空的值存入变量$validValue - 遍历
zoo数组的每个对象,将所有guesst字段统一设置为这个有效值
精准匹配方案(针对已知键名)
如果明确需要用y的guesst值覆盖x的guesst,可以直接根据键名定位,无需依赖数组位置:
jq '($targetVal = .zoo[] | .y.guesst) | .zoo[] | .x.guesst = $targetVal'
逻辑说明:
- 从
zoo数组中找到包含y键的对象,取出其guesst值存入$targetVal - 遍历
zoo数组找到包含x键的对象,将它的guesst字段设置为$targetVal
内容的提问来源于stack exchange,提问作者Udi
相关产品推荐
相关产品推荐

