You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用jq更新JSON数组中已存在元素的值

如何使用jq更新JSON数组中已存在元素的值

我来帮你搞定这个问题!你现在的需求是用jq处理JSON数组,既要添加新的键值对,又要覆盖已存在键对应的旧值对吧?你之前用.C += $val的方式只是单纯把新数组追加进去,所以会出现重复的Z条目,而不是更新它的数值。

这里的核心思路是:先把原数组和更新数组合并,然后按照每个子数组的第一个元素(也就是你说的“键”)分组,最后每组只保留最后出现的元素——这样既保留了原数组里没有被更新的条目,又用新值覆盖了已存在的键,同时还能添加全新的条目。

直接给你能用的完整命令:

cat test_data.json | jq --argjson val "${update}" '.C = (.C + $val | group_by(.[0]) | map(last))'

我给你拆解一下这个命令的逻辑:

  • .C + $val:把原数组C和传入的更新数组$val合并,这时候会包含重复的["Z", "test3"]和["Z", "test4"]
  • group_by(.[0]):按照每个子数组的第一个元素(也就是X/Y/Z/D/E这些“键”)进行分组,重复的Z会被分到同一组里
  • map(last):对每个分组取最后一个元素,这样更新后的["Z", "test4"]就会替换掉原来的["Z", "test3"],其他没有重复的条目则保持原样

运行这个命令后,就能得到你想要的输出啦:

{
  "A": "12",
  "B": "34",
  "C": [
    ["X", "test1"],
    ["Y", "test2"],
    ["Z", "test4"],
    ["D", "test5"],
    ["E", "test6"]
  ]
}

如果之后你的“键”不是子数组的第一个元素,只要把group_by(.[0])里的0改成对应的索引就行,非常灵活。

备注:内容来源于stack exchange,提问作者Preeti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 14:12:31