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

JS中以ID为数组键生成冗余子数组,求按指定ID分组的正确实现

解决JavaScript数组作为ID分组键导致冗余子数组的问题

这个问题的根源在于JavaScript数组的本质是索引密集型集合——当你直接给数组的一个大数字索引(比如3355)赋值时,JS会自动把数组的length设置为该索引+1,并且填充从0到该索引-1之间所有未定义的位置(这些就是你看到的冗余空数组),完全是没必要的内存浪费。

解决这个问题的核心思路是:放弃用数组存储分组,改用离散键的集合,比如普通对象或者ES6的Map,它们只会存储你实际用到的键,不会生成中间的空项。

方案1:使用普通对象(最兼容的方案)

把zgrupa从数组改成普通对象,这样只会创建你需要的ID键对应的数组:

// 初始化zgrupa为对象(而非数组)
if (rezerwacjePosortowanePoGrupie['zgrupa'] === undefined) { 
  rezerwacjePosortowanePoGrupie['zgrupa'] = {}; 
}
// 检查当前ID对应的分组是否存在,不存在则创建空数组
if (rezerwacjePosortowanePoGrupie['zgrupa'][idGrupy] === undefined) { 
  rezerwacjePosortowanePoGrupie['zgrupa'][idGrupy] = []; 
}
// 把item推入对应分组
rezerwacjePosortowanePoGrupie['zgrupa'][idGrupy].push(item);

对象的键是离散存储的,只会保留你显式赋值的键,不会自动填充中间的索引位置,完美解决冗余问题。

方案2:使用ES6 Map(更适合数字键的方案)

如果你用的是支持ES6的环境,Map是更优雅的选择——它可以直接用数字作为键(对象的键会被强制转为字符串),还有专门的方法来处理键的检查和操作:

// 初始化zgrupa为Map实例
if (rezerwacjePosortowanePoGrupie['zgrupa'] === undefined) { 
  rezerwacjePosortowanePoGrupie['zgrupa'] = new Map(); 
}
// 检查Map中是否存在当前ID的分组,不存在则设置为空数组
if (!rezerwacjePosortowanePoGrupie['zgrupa'].has(idGrupy)) { 
  rezerwacjePosortowanePoGrupie['zgrupa'].set(idGrupy, []); 
}
// 获取对应分组数组并推入item
rezerwacjePosortowanePoGrupie['zgrupa'].get(idGrupy).push(item);

额外说明

为什么原来的数组写法会出问题?举个例子:当你执行arr[3355] = []时,JS会把arr.length设为3356,同时索引0到3354的位置都会被标记为undefined(在控制台里看起来就是一堆空的子数组),这些完全是无用的内存占用,换成对象或Map就能彻底避免这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:41:53