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

使用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)

命令解释

以第一种写法为例,拆解每一步的作用:

  1. .[0] as $names:将输入JSON里的第一个名称列表数组存入变量$names,方便后续重复引用
  2. .[1] |= ...:使用|=赋值操作符,对第二个数组执行修改后直接替换原数组
  3. map(...):遍历第二个数组中的每一个对象元素
  4. 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[]))存在两个核心问题:

  1. in()是jq中用来判断键是否存在于对象的函数,判断元素是否在数组里应该使用大写的IN()
  2. 这个命令仅输出了每个name是否匹配的布尔值,没有对原数组的对象进行修改操作,自然无法实现添加字段的需求

内容的提问来源于stack exchange,提问作者britzkopf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:28:10