Lodash源码解析-------chunk函数

基本思想

没有看过chunk函数的内部实现,根据官方文档给出的功能自己编写实现。

chunk函数接受两个参数,第一参数为array类型,第二个参数为number类型,其作用的是:将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。例子如下:

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

这里我没有遍历整个数组,这样是没有必要的,利用Aarry类型的slice函数进行优化:

  1. 首先要判断传入函数的参数类型,如果不是array或者第二参数不是number要抛出异常
  2. 记录每个分割的临时数组的长度,用数组的整个长度余上要分割的数量
  3. 看这个余数是否为0,如果不为0,做除法后要加1,这是因为我们前面要尽可能添加多的元素
  4. 这里有个坑的点,我们最后part的值要娶一个整数,然后除法运算符默认返回IEEE754浮点数,例如:5/3返回的是1.666666667这种,要用parseInt转换为int
  5. 这样之后,我们只要每次截取part个值即可,只需循环size次就可以得到答案

实现代码

(function(window){
    function chunk(arr, splitnum){
        /** 首先判断类型,如果类型不对,直接抛出异常 */
        if(typeof splitnum != 'number' || (Object.prototype.toString.call(arr) != '[object Array]')){
            throw Error("当前参数类型错误");
        }
        let rest = arr.length % splitnum;
        let newArr = [], part = (rest == 0 ? parseInt(arr.length / splitnum) : parseInt(arr.length / splitnum + 1));
        for(let index = 0; index < splitnum; index ++){
            let start = (index * part), end = ((start + part) > arr.length ? arr.length : (start + part));
            let tmpArr = arr.slice(start, end);
            newArr.push(tmpArr);
        }
        return newArr;
        
    }
    window.chunk = chunk;
})(window);
发布了17 篇原创文章 · 获赞 0 · 访问量 465

猜你喜欢

转载自blog.csdn.net/chizhonghang/article/details/105444833
今日推荐