JavaScript如何为数组内对象的重名键添加序号重命名?
问题根因
- JS对象本身不支持重名键,你示例中写的对象字面量在代码解析阶段就会自动覆盖重复的
A键,最终只会保留最后一个A对应的{name: 'hello3'},这是你运行代码只得到一个修改后值的核心原因。 - 原有代码存在逻辑错误:
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
相关产品推荐
相关产品推荐

