使用JQ为JSON数组对象添加序号键值对时出现重复问题求助
问题排查与修复
原代码的错误点
流展开导致重复处理
原代码里的(.data.items, .data.primaryItemResultList.items)使用逗号运算符,会把两个数组(如果存在)转换成数据流,后续操作会分别作用于这两个流,最终输出两次处理结果,直接引发对象重复。笛卡尔积引发对象爆炸
values[] += {ranking: range(1, $l)}是核心错误:range(1, $l)会生成1到$l-1的数组(JQ的range是左闭右开规则),当把这个数组赋值给每个数组元素时,JQ会执行笛卡尔积运算——每个原对象都会和range里的每个值组合一次,比如原数组20个元素,range生成20个值,最终会得到20×20=400个对象,这就是你看到数量暴增的原因。破坏原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
相关产品推荐
相关产品推荐

