使用jq依据数组字符串修改JSON数组中的目标对象
解决jq给匹配指定名称的对象添加字段问题
正确的jq命令
针对你的需求,这里提供两种可行的写法:
写法一(直观易懂,适合小规模数据)
.[0] as $names | .[1] |= map(if .name | IN($names[]) then . + {found: true} else . end)
写法二(高效查找,适合大规模数据)
如果第一个数组元素数量较多,把它转成键值集合能显著提升查找效率:
.[0] | INDEX(. ; .) as $nameMap | .[1] |= map(if $nameMap[.name] then . + {found: true} else . end)
命令解释
以第一种写法为例,拆解每一步的作用:
.[0] as $names:将输入JSON里的第一个名称列表数组存入变量$names,方便后续重复引用.[1] |= ...:使用|=赋值操作符,对第二个数组执行修改后直接替换原数组map(...):遍历第二个数组中的每一个对象元素if .name | IN($names[]) then . + {found: true} else . end:判断当前对象的name字段值是否存在于$names数组中,若是则为对象添加found: true字段,否则保持原对象不变
示例输出
用你的测试输入执行命令后,输出结果如下:
[ [ "test1", "test2", "test3" ], [ { "name": "test5", "data": "five" }, { "name": "test1", "data": "four", "found": true }, { "name": "test2", "data": "three", "found": true }, { "name": "test3", "data": "six", "found": true } ] ]
你之前写法的问题
你写的.[0] as $tn | (.[1] | .[] | .name | in($tn[]))存在两个核心问题:
in()是jq中用来判断键是否存在于对象的函数,判断元素是否在数组里应该使用大写的IN()- 这个命令仅输出了每个
name是否匹配的布尔值,没有对原数组的对象进行修改操作,自然无法实现添加字段的需求
内容的提问来源于stack exchange,提问作者britzkopf
相关产品推荐
相关产品推荐

