Lodash源码解析-_.chunk

2021-06-29  本文已影响0人  小妍妍说
_.chunk(array, [size=1])

将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。size如果未填写,默认为1。

例子:

_.chunk(['a', 'b', 'c', 'd', 'e'], 2);
// => [['a', 'b'], ['c', 'd'], ['e']]

自己实现

function chunk(arr,num){
  if (num<1) return;
  var newarr=[];
  for(var i=0;i<arr.length/num;i++)
  {
    newarr.push(arr.slice(num*i,(i+1)*num))
  }
  return newarr;
}

_.chunk源码

import slice from './slice.js'
import toInteger from './toInteger.js'


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


// while循环用来遍历array数组,每次截取array中的size个元素并将截取结果添加到result数组中
// slice函数用的是lodash自己封装的方法
  while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }
  return result
}

总结:自己实现的时候使用了数组的两个函数:push(),slice(),并且没有写默认参数值(size=1),lodash写的循环体更加简洁。

上一篇 下一篇

猜你喜欢

热点阅读