chunk()

_.chunk(array, [size = 1])

每天更新一个lodash方法源码解析

chunk()方法是将数组中的元素进行分块,每一块为一个数组,最终返回由每个块组成的数组。

example:
_.chunk([1, 3, 5, 7, 9], 2)
// [[1, 3], [5, 7], [9]]
_.chunk([1, 2, 3, 4, 5, 6], 3)
// [[1, 2, 3], [4, 5, 6]]
_.chunk([1, 2, 3, 4, 5], 0)
// []
_.chunk([1, 2, 3, 4, 5])
// [[1], [2], [3], [4], [5]]

chunk(arr, size)接收两个参数,一个是原数组,一个是分块的大小size,默认值为1,原数组中的元素会按照size的大小从头开始分块,每一块组成一个新数组,如果最后元素个数不足size的大小,那么它们会组成一个快。

源码解析:
function chunk(array, size) {
  // size默认值为1
  // 如果size小于0,取0处理,大于0,则取size值
  size = Math.max(size, 0)
  // 如果array为null,length取0,否则取array.length
  const length = array == null ? 0 : array.length
  // 如果length为0或者size小于1,返回一个空数组
  if (!length || size < 1) {
    return []
  }
  let index = 0
  let resIndex = 0
  // 用数组的长度除以size并向上取整以得到分块的个数,新建一个长度为分块个数的数组result
  const result = new Array(Math.ceil(length / size))

  // 下面的while循环主要做的事情是遍历array数组,每次截取array中的size个元素并将截取结果添加到result数组中
  // while循环中index从0开始,每次增加size大小,直到index大于等于length时跳出循环
  // 每次循环时,result数组中的索引resIndex加1
  // 在每次循环体中,从array中截取索引为index到(index+size)之间的元素返回一个数组,并将返回结果添加到result数组中
  // 截取array元素时使用的方法slice实现可以查看slice对应的源码分析
  while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }
  // 返回最终结果result
  return result
}

实现思路:利用原数组的长度和size计算出需要分块的数量,然后利用分块数量生成一个新数组,然后遍历原数组,截取index到index+start之间的元素(包含start,不包含index+start)并依次给到新数组中,最后返回新数组。

2019/6/16

你可能感兴趣的:(lodash,源码,javascript)