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

如何用jq将同一条目字段值复制到另一字段并保留顶层输出?

在jq中将数组条目内的字段值复制到同一条目的另一个字段

给定输入JSON:

{
  "items": [
    {
      "name": "first"
    },
    {
      "name": "second"
    }
  ]
}

需要实现的效果是:为items数组中的每个对象新增value字段,其值与同对象的name字段一致,期望输出:

{
  "items": [
    {
      "name": "first",
      "value": "first"
    },
    {
      "name": "second",
      "value": "second"
    }
  ]
}

静态值赋值(如jq '.items[].value |= "x"')可以正常修改,但动态复制同条目字段值时,要么出现value为null的上下文错误,要么输出仅单个条目而非完整顶层结构。


解决方案

方法一:对象合并写法

使用|=锁定数组元素的修改上下文,通过对象合并新增字段:

jq '.items[] |= . + {value: .name}' input.json
  • .items[]定位到数组中的每个元素
  • |= 表示将修改后的元素替换回原数组位置,保证顶层JSON结构完整
  • . + {value: .name} 将当前元素(.指代)与包含value字段的新对象合并,自动保留原有name字段

方法二:直接字段赋值写法

更简洁的直接赋值方式,同样利用|=锁定上下文:

jq '.items[] |= (.value = .name)' input.json

括号确保.value = .name操作的上下文是当前数组元素,.正确指向元素内的name字段,赋值后原元素结构被保留并替换回数组。


错误原因说明

  • 若直接使用jq '.items[].value = .name',赋值时.的上下文会跳转到顶层JSON(而非数组元素),顶层不存在name字段,导致value被设为null
  • 若错误使用jq '.items[] | .value = .name',则会只输出修改后的单个元素,丢失顶层的items结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:43:36