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

使用JQ为JSON数组对象添加序号键值对时出现重复问题求助

问题排查与修复

原代码的错误点

  1. 流展开导致重复处理
    原代码里的(.data.items, .data.primaryItemResultList.items)使用逗号运算符,会把两个数组(如果存在)转换成数据流,后续操作会分别作用于这两个流,最终输出两次处理结果,直接引发对象重复。

  2. 笛卡尔积引发对象爆炸
    values[] += {ranking: range(1, $l)}是核心错误:range(1, $l)会生成1到$l-1的数组(JQ的range是左闭右开规则),当把这个数组赋值给每个数组元素时,JQ会执行笛卡尔积运算——每个原对象都会和range里的每个值组合一次,比如原数组20个元素,range生成20个值,最终会得到20×20=400个对象,这就是你看到数量暴增的原因。

  3. 破坏原JSON结构
    最后的.[]会把处理后的数组拆分成单个对象输出,丢失了原有的data层级结构,不符合期望的输出格式。

修复后的JQ代码

要保留原JSON结构,同时为两个数组(如果存在)的元素添加正确的ranking值,使用以下代码:

.data |= (
  # 处理.items数组,为每个元素添加从1开始的ranking序号
  .items |= (to_entries | map(.value.ranking = .key + 1 | .value))?
  # 处理.primaryItemResultList.items数组,逻辑同上
  | .primaryItemResultList.items |= (to_entries | map(.value.ranking = .key + 1 | .value))?
)

代码说明

  • to_entries将数组转换成{key: 索引, value: 原元素}的对象数组,索引从0开始;
  • .value.ranking = .key + 1为每个原元素添加ranking值(索引+1对应1起始的序号);
  • map(...)处理完成后提取.value还原成原数组结构;
  • 末尾的?确保如果对应的数组不存在(比如示例输入里没有primaryItemResultList),代码不会报错。

示例输入测试

用修复后的代码处理你提供的简化输入,会精准生成期望输出:每个items数组元素按顺序添加ranking:1、ranking:2、ranking:3,同时完整保留原JSON结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:46:08