最常用的方式是用 slice 配合循环截取固定长度子数组,不修改原数组、语义清晰、兼容性好;设定 size,从索引 0 开始步进截取 arr.slice(i, i + size),自动处理末尾不足,并 push 到结果数组。

最常用也最直接的方式,是用 slice 配合循环截取固定长度的子数组。它不修改原数组、语义清晰、兼容性好,适合绝大多数分块场景。
用 slice + for 循环实现基础分块
这是前端开发中最常写的写法,逻辑直观,易于调试和维护:
- 设定每块大小 size,从索引 0 开始,每次步进 size
- 用
arr.slice(i, i + size)截取当前段,自动处理末尾不足的情况 - 把每次截取的结果
push到结果数组中
示例代码:
function chunk(arr, size) {const result = [];
for (let i = 0; i result.push(arr.slice(i, i + size));
}
return result;
}
用 reduce 实现声明式分块
如果你倾向函数式风格,reduce 能写出更紧凑的版本,适合嵌入链式调用中:
- 遍历每个元素,根据当前索引计算所属块号:
Math.floor(index / size) - 用
acc[chunkIndex]累积对应块的元素 - 最后过滤掉空数组(当输入为空或 size ≤ 0 时)
优点是无显式索引变量,缺点是性能略低于循环(需多次计算索引),且可读性对新手稍弱。
处理边界情况要主动判断
健壮的分块函数不能只顾主流程,这几个点容易出错:
- size ≤ 0 或 非数组输入:应提前返回空数组或抛错,避免静默失败
- size 大于原数组长度:此时应返回仅含一个子数组的二维数组,而不是空结果
-
空数组输入:直接返回
[ ],不是[ [ ] ]
这些检查加在函数开头两行就能大幅降低线上报错率。
大数组或流式场景优先考虑生成器
当数据量极大(如十万级)、或只需逐块消费而无需全量内存驻留时,用生成器更省资源:
- 用
function*定义,内部仍用slice截取,但每次只产出一块 - 调用方用
for...of消费,或转为数组Array.from(chunkGenerator) - 配合
itertools.islice(Python)或Array.prototype.values()(JS)可进一步优化
这种写法不一次性构造所有子数组,内存占用恒定,适合批处理、文件解析等后台任务。

















