程序员让前端飞Web前端之路

lodash源码之chunk

2020-02-29  本文已影响0人  hahalang

1、使用场景

_.chunk(array, [size=1])
将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果 array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。

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

2、自己实现一个简单的chunk方法

看到 chunk 方法的使用示例之后,自己实现了一个简单 chunk 函数,不过没有对参数的类型做太多的处理。

function chunk(arr, size = 1) {
  if(size >= arr.length) {
    return arr;
  } else if(size < 1) {
    return [];
  };
  const newArr = [];
  const loop = Math.ceil(arr.length / size);
  for(let i = 0; i < loop; i++) {
    newArr.push(arr.slice(i * size, (i + 1) * size));
  };
  return newArr;
};

3、源码分析

chunk.js

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

function chunk(array, size = 1) {
  size = Math.max(toInteger(size), 0)
  const length = array == null ? 0 : array.length
  if (!length || size < 1) {
    return []
  }
  let index = 0
  let resIndex = 0
  const result = new Array(Math.ceil(length / size))
  while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }
  return result
}

export default chunk

分析 chunk 这个函数,从函数传入的参数开始:
1. 参数

function chunk(array, size = 1)

如果 chunk() 这个方法只传一个参数,那么 size 默认取 1,传入的数组 array 就会被分割成长度是 1 的数组。即:chunk([1,2,3]) => [[1],[2],[3]]
2、对参数size的处理

size = Math.max(toInteger(size), 0)

首先解释 toInteger(size) 这个方法,这个方法可以把 size 转换成整数,如果 size 不能转换成 Number 类型,该方法就返回 0。Math.max 方法是取最大值。总结下来就是:

3、如果传入的array和size不符合,就直接返回[]

const length = array == null ? 0 : array.length
if (!length || size < 1) {
  return []
}

这里总结了返回 [] 的几种情况:

如果参数类型都符合条件,就到了正式处理的环节了:
  let index = 0
  let resIndex = 0
  const result = new Array(Math.ceil(length / size))
  while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }
  return result
const result = new Array(Math.ceil(length / size))

这里先使用new Array让result成为一个固定长度的空数组,可能会比直接让它成为一个空数组性能更高一些;

 while (index < length) {
    result[resIndex++] = slice(array, index, (index += size))
  }

slice(array, index, (index += size)) 实际上就类似数组的 slice 方法,即:array.slice(index, index += size) 。
最后 把 result 这个数组 return 出去即可。

上一篇 下一篇

猜你喜欢

热点阅读