如何用JQ向指定user对应的videos数组中插入JSON元素
正确使用JQ向指定用户的videos数组添加元素
原始JSON数据
[ { "user":"user-1", "videos":[ { "key":"key1", "url":"url1" } ] }, { "user":"user-2", "videos":[ { "key":"key2", "url":"url2" } ] } ]
需求
向"user":"user-2"对应的videos数组中添加{"key":"key3","url":"url3"},最终目标结构如下(注:示例结果中url字段改为title,实际操作可按需调整字段名):
[ { "user":"user-1", "videos":[ { "key":"key1", "title":"title1" } ] }, { "user":"user-2", "videos":[ { "key":"key2", "title":"title2" }, { "key":"key3", "title":"title3" } ] } ]
错误命令分析
你之前使用的命令:
jq '. += [{"user":"user-2","videos":[{"key":"key3","title":"title3"}]}]'
会直接向顶层数组追加一个全新的user-2对象,而非修改原有对象的videos数组,不符合需求。
正确JQ命令
方法1:遍历数组精准修改
jq 'map(if .user == "user-2" then .videos += [{"key":"key3","url":"url3"}] else . end)'
方法2:直接定位目标对象(效率更高)
jq '(.[] | select(.user == "user-2").videos) += [{"key":"key3","url":"url3"}]'
命令说明
- 方法1通过
map遍历顶层数组的每个对象,判断对象的user字段是否为user-2,若是则对其videos数组执行追加操作(+=),其余对象保持原样返回。 - 方法2先通过
select筛选出user-2的对象,直接定位到它的videos数组执行追加,无需遍历所有元素,处理大数组时效率更高。
内容的提问来源于stack exchange,提问作者ClassyUnderexposure
相关产品推荐
相关产品推荐

