lodash 代码解析--chunk

55 阅读2分钟

好的,我来用简单的语言解释一下 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 按位置切分,简单高效。

这样,无论数组多长,都能正确分成指定大小的块! 🍞🔪