如何用一行简洁代码初始化包含n个互不相同空数组的新数组
问题根因
Array.prototype.fill() 方法的逻辑是将同一个值填充到数组的所有目标位置。当你传入引用类型(比如空数组[])时,填充的是同一个内存引用地址,所有数组元素都指向同一个数组实例,所以修改任意一个子数组都会同步影响所有其他元素,这就是你测试代码中badBucket的所有子数组都被推入33的原因。
你使用的JSON序列化反序列化方案虽然能生成独立数组,但存在明显局限性:无法处理JSON不支持的数据类型(函数、Symbol、undefined、循环引用、BigInt等),会造成数据丢失或报错,不推荐作为通用解决方案。
推荐实现方案
两种常用的无副作用写法:
- 方案1:使用
Array.from(最简洁)
const radix = 10; const bucket = Array.from({ length: radix }, () => []); // 每个子数组都是独立的新数组,修改互不影响 bucket[3].push(33); // 只有bucket[3]会被修改
- 方案2:使用
map遍历生成
const radix = 10; const bucket = Array(radix).fill().map(() => []); // 先调用fill()填充占位值,再通过map每次返回新的空数组
关于fill方法的说明
fill 本身的设计就是静态值批量填充,没有办法直接通过fill实现动态生成不同引用值的需求,所有能达成目标的写法本质上都是额外叠加了「每次生成新值」的逻辑,并非单纯依赖fill的原生能力。
内容的提问来源于stack exchange,提问作者Vahe
相关产品推荐
相关产品推荐

