lodash是一个工具库,跟underscore差不多

chunk函数的作用: 把一维数组,按照固定的长度分段成二维数组

如:

chunk( [ 10, 20, 30, 40 ], 2 )     结果:  [[10, 20], [ 30, 40 ]]
解释:把数组[ 10, 20, 30, 40] 按每2个元素分成一段, 一共分成2段
chunk( [ 10, 20, 30, 40 ], 3 )     结果: [[10, 20, 30], [40]]
解释:把数组[10, 20, 30, 40] 按每3个元素分成一段, 剩下的那个元素,独立作为一段
chunk( [ 10, 20, 30, 40 ], 1 )     结果: [[10],[20],[30],[40]]
解释:把数组[10, 20, 30, 40] 按每个元素分成一段, 一共可以分成4段
         function chunk(array, size) {
size = Math.max(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++] = array.slice(index, (index += size));
}
return result;
}

第2行: size=Math.max( size, 0 ); 获取0和size之间的较大值, 纵观整个函数, 通俗点讲就是,如果size是负数,把size变为0,其实整个函数 有个小bug, 那就是没有对size是否传递参数做判断,

如果这样用 chunk( [ 10, 20, 30 ] ) 这样会报错,因为size没有传,默认为undefined, 在第9行 length / size的时候就会报错,  所以我认为更加严谨的做法是在第二行代码之间,再加一句判断:

size = ( typeof size === 'undefined' ) ? 0 : size;
 这样就算是size没有传递参数,也可以把他变为0
第3行: const length = array == null ? 0 : array.length;   用来判断是否传递的是空数组,如果是length = 0, 如果不是length就是数组的实际长度
第4行:
if (!length || size < 1) {
return [];
}
如果长度为0, 或者size < 1 就不用往下执行了, 直接返回一个空数组
 
第9行:
const result = new Array(Math.ceil(length / size));
这句话是整个分段数组功能中很关键的一句, 把一维数组根据size需要分成的段数算出来了,
如  [ 10, 20, 30, 40 ], 这个一维数组, length = 4,
如果size = 1, 就可以分成4段 [ [], [], [], [] ]
如果size = 2, 就可以分成2段 [ [], [] ]
如果size = 3, 还是分成2段 [ [], [] ]
如果size = 4, 分成1段 [ [] ]
 
第11-13行就是 把具体的值 插入到对应的段
while (index < length) {
result[resIndex++] = array.slice(index, (index += size));
}
写法非常的精简,这段代码,如果我改成for循环,相信你应该很容易就能看懂
for( ; index < length; ) {
result[resIndex] = array.slice( index, index + size );
resIndex++;
index = index + size;
}
 正常情况需要3句,现在精简成一句。
 
 drop函数: 其实就是把slice封装了一次,其实lodash本身并不是这么写的,在lodash中,slice被重新封装了一次,我把他改成原生slice用法,抽取出来,便于分析
         function drop(array, n = 1) {
const length = array == null ? 0 : array.length;
return length
? array.slice( n < 0 ? 0 : n, length)
: [];
} console.log( drop( [ 10, 20, 30 ] ) ); //[ 20, 30 ]
console.log( drop( [ 10, 20, 30 ], 3 ) ); //[]
console.log( drop( [ 10, 20, 30 ], 2 ) ); //[30]

lodash框架中的chunk与drop函数源码逐行分析的更多相关文章

  1. Vue中之nextTick函数源码分析

    Vue中之nextTick函数源码分析 1. 什么是Vue.nextTick()?官方文档解释如下:在下次DOM更新循环结束之后执行的延迟回调.在修改数据之后立即使用这个方法,获取更新后的DOM. 2 ...

  2. PHP 源码 — intval 函数源码分析

    PHP 源码 - intval 函数源码分析 文章来源: https://github.com/suhanyujie/learn-computer/ 作者:suhanyujie 基于PHP 7.3.3 ...

  3. PHP 源码 —— is_array 函数源码分析

    is_array 函数源码分析 本文首发于 https://github.com/suhanyujie/learn-computer/blob/master/src/function/array/is ...

  4. MapReduce中TextInputFormat分片和读取分片数据源码级分析

    InputFormat主要用于描述输入数据的格式(我们只分析新API,即org.apache.hadoop.mapreduce.lib.input.InputFormat),提供以下两个功能: (1) ...

  5. SPRING框架中ModelAndView、Model、ModelMap区别及详细分析

    转载内容:http://www.cnblogs.com/google4y/p/3421017.html 1. Model Model 是一个接口, 其实现类为ExtendedModelMap,继承了M ...

  6. 序列化器中钩子函数源码分析、many关键字源码分析

    局部钩子和全局钩子源码分析(2星) # 入口是 ser.is_valid(),是BaseSerializer的方法 # 最核心的代码 self._validated_data = self.run_v ...

  7. Go语言fmt库的print函数源码解析

    // Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a B ...

  8. Spark GraphX的函数源码分析及应用实例

    1. outerJoinVertices函数 首先给出源代码 override def outerJoinVertices[U: ClassTag, VD2: ClassTag] (other: RD ...

  9. [转]delphi 有授权许可的字符串拷贝函数源码

    一段看上去“貌不惊人”的Delphi插入汇编代码,却需要授权许可,但是与经典的同类型函数比较,确实“身手不凡”. 研究代码的目的在于借鉴,本文通过分析,并用C++重写代码进行比较,再次证明这段代码效率 ...

随机推荐

  1. css自定义动画在微信中无法执行的原因

    这是我去年年底遇到的一个问题, 在这个过程中我发现了一个比较有趣的问题. 我们在做抽奖的时候,微信分享到朋友圈的页面里,安卓机器无法执行页面中的自定义动画(元宝的位移,进入按钮的放大缩小等等).这让我 ...

  2. NewsServiceImpl

    package com.pb.news.service.impl; import java.util.List; import com.pb.news.dao.NewsDao;import com.p ...

  3. frames.contentWindow.document InvalidCastException 转换错误异常。

    http://bbs.csdn.net/topics/210027068   和 https://bytes.com/topic/c-sharp/answers/248557-threading-pr ...

  4. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  5. Java基础语法<九> 接口与内部类

    1 接口  interface implement 接口的所有方法自动地属于public.因此,在接口中声明方法时,不必提供关键字public.   接口可以包含多个方法,接口中可以定义常量.接口中的 ...

  6. FineReport单元格扩展与父子格设置

    1.描述 在讲述报表设计之前,首先介绍一下FineReport报表制作的几个基本概念,本章节介绍FineReport报表赖以生存的单元格扩展. 扩展,顾名思义,就是由一变多,那么单元格扩展就是指在we ...

  7. css display:box 新属性

    一.display:box; 在元素上设置该属性,可使其子代排列在同一水平上,类似display:inline-block;. 二.可在其子代设置如下属性 前提:使用如下属性,必须在父代设置displ ...

  8. Git 使用问题 - win7 git bash下git pull失败

    win7 旗舰版,从github上pull代码时,git bash命令出现错误 Administrator@rust-PC /g/rust_proj/cardslib (master) $ git - ...

  9. PhpStrom如何安装主题?(总结三种不同格式安装方法)

    在网上搜了很多都是不怎么齐全的方法,在这里我总结一下PhpStrom的三种不同格式的安装方法,以后就不用再去网上搜直接看我自己的博客就知道了.以下默认为Windows系统,Linux现在暂时还没更新. ...

  10. UVA - 1639 -Candy

    题目链接:https://vjudge.net/problem/UVA-1639 题目大意: 有两个糖果盒,每个盒子里面有n个糖果,每天随机选一个(概率分别为p,1-p),然后吃一颗糖.直到有一天,打 ...