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

JavaScript如何为数组内对象的重名键添加序号重命名?

问题根因
  1. JS对象本身不支持重名键,你示例中写的对象字面量在代码解析阶段就会自动覆盖重复的A键,最终只会保留最后一个A对应的{name: 'hello3'},这是你运行代码只得到一个修改后值的核心原因。
  2. 原有代码存在逻辑错误:itemList是数组,用for in遍历数组拿到的是数组下标,不是内部对象的键名,且重命名函数的赋值逻辑也存在问题,没有正确完成对象更新。
方案1:保留带序号后缀的对象结构

如果需要保留对象键名带序号的结构,必须从原始数据源阶段处理,避免重复键被JS引擎提前覆盖。假设你能拿到所有未丢失的键值对集合(比如通过自定义JSON解析器从原始响应文本中提取),可以用以下O(n)时间复杂度的实现,单次遍历即可完成,适配万级以上数据量:

// 示例未丢失重复键的键值对集合
const originEntries = [['A', {name: 'hello1'}], ['A', {name: 'hello2'}], ['A', {name: 'hello3'}]];
const keyCounter = {};
const processedObj = {};

for (const [key, value] of originEntries) {
  const currentCount = keyCounter[key] ?? 0;
  processedObj[`${key}${currentCount}`] = value;
  keyCounter[key] = currentCount + 1;
}

const itemList = [processedObj];

运行后即可得到你预期的A0/A1/A2后缀的对象结构。

方案2:改用数组存储(推荐,性能最优)

大数据量场景下更推荐用数组存储同键名的内容,不需要处理键名冲突,读写效率更高,实现逻辑如下:

const originEntries = [['A', {name: 'hello1'}], ['A', {name: 'hello2'}], ['A', {name: 'hello3'}]];
const keyGroup = {};
for (const [key, value] of originEntries) {
  if (!keyGroup[key]) keyGroup[key] = [];
  keyGroup[key].push(value);
}

使用时直接通过下标访问即可,比如取第一个A对应的值写keyGroup.A[0],第二个写keyGroup.A[1],比后缀键名的操作更简便,遍历和修改的性能也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:30:04