好的,我来用简单的语言解释一下 Lodash 中 chunk
方法的实现原理,就像切面包一样容易理解!
1. 检查参数是否有效
- 情况一:如果数组是空的,或者
size
(每块的大小)小于 1,直接返回空数组[]
。chunk([], 2) // 返回 [] chunk([1,2,3], 0) // 返回 []
2. 计算需要切成多少块
- 用数组长度除以每块的大小
size
,然后向上取整。比如:- 数组
[1,2,3,4,5]
,size=2
→ 长度 5 / 2 = 2.5 → 向上取整得到 3 块。 - 结果会是
[[1,2], [3,4], [5]]
。
- 数组
3. 开始“切”数组
- 初始化一个空的结果数组(比如一个空盘子)。
- 用
while
循环,每次从原数组切下size
个元素,放到结果数组里。// 例子:原数组 [1,2,3,4,5],size=2 let index = 0; // 当前切的位置 const result = []; // 第一次循环:切 [1,2],index 变成 2 result[0] = array.slice(0, 2) → [1,2] // 第二次循环:切 [3,4],index 变成 4 result[1] = array.slice(2, 4) → [3,4] // 第三次循环:切 [5],index 变成 6(超过长度,停止循环) result[2] = array.slice(4, 6) → [5]
4. 处理最后一块不够的情况
- 如果最后剩下的元素不够
size
个,比如例子中的[5]
,直接保留这些元素。 - 这里利用了
slice
的特性:如果结束位置超过数组长度,就切到末尾。
完整代码模拟
function chunk(array, size) {
// 1. 处理无效参数
if (!array || size < 1) return [];
// 2. 计算块数
const length = array.length;
const chunkCount = Math.ceil(length / size);
const result = new Array(chunkCount);
// 3. 开始切分
let index = 0;
for (let i = 0; i < chunkCount; i++) {
// 每次切下 size 个元素(如果不够,就切到末尾)
result[i] = array.slice(index, index + size);
index += size; // 更新切的位置
}
return result;
}
举个实际例子
chunk([1, 2, 3, 4, 5], 2);
// 执行过程:
// 1. 计算块数:5/2 → 3块
// 2. 切分:
// - 切 [0,2) → [1,2]
// - 切 [2,4) → [3,4]
// - 切 [4,6) → [5]
// 结果:[[1,2], [3,4], [5]]
关键点总结
- 参数检查:处理无效输入。
- 计算块数:向上取整保证最后一块能保留。
- 循环切分:用
slice
按位置切分,简单高效。
这样,无论数组多长,都能正确分成指定大小的块! 🍞🔪