当前位置: 首页 > 编程日记 > 正文

读Lodash源码——chunk.js

The time is out of joint: O cursed spite, That ever I was born to set it right. --莎士比亚

最艰难的第一步

最近学习遇到了些障碍,浮躁浮躁又浮躁。很难静下心来做一件事,北京的寒风也难以让我冷静下来.

之前一直很想找个源码读读,太懒,总是各种理由敷衍自己.于是下定决心迈出第一步,读Lodash源码!

就从api的一个开始读!

chunk.js

先看一下例子

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

chunk函数主要想实现的功能是:传入一个数组,指定分割值,输出分割后的数组

看一下chunk.js的源码

import slice from './slice.js'/*** Creates an array of elements split into groups the length of `size`.* If `array` can't be split evenly, the final chunk will be the remaining* elements.** @since 3.0.0* @category Array* @param {Array} array The array to process.* @param {number} [size=1] The length of each chunk* @returns {Array} Returns the new array of chunks.* @example** chunk(['a', 'b', 'c', 'd'], 2)* // => [['a', 'b'], ['c', 'd']]** chunk(['a', 'b', 'c', 'd'], 3)* // => [['a', 'b', 'c'], ['d']]*/
function chunk(array, size) {size = Math.max(size, 0)const length = array == null ? 0 : array.lengthif (!length || size < 1) {return []}let index = 0let resIndex = 0const result = new Array(Math.ceil(length / size))while (index < length) {result[resIndex++] = slice(array, index, (index += size))}return result
}export default chunk

ok下面开始分析:

  1. 首先定义一个函数 chunk 需要传递两个参数:一个数组:array,一个分割值:size

  2. 先举个栗子,如果我输入的数组是 :array = [0,1,2] 分割值是: size = 1,最终应该返回一个这样的数组: [[0],[1],[2]].

    再比如array = [0,1,2,3],分割值是: size = 3,那么结果就是:[[0,1,2],[3]],有没有发现规律(样本这么少发现才怪,逃...

  3. 通过源码可以发现数组的 lengthsize有密切关联.

    也就是说数组的长度是4,分割值为1时,应该返回四个数组;

    当分割值为2时,应该返回两个数组;

    当分割值为3时,应该返回2个数组;

    当分割值为4时,应该返回一个数组.

    那么问题来了,当分割值为3时,4/3=1.3333怎么确保割后的数组长度为2呢.

    于是就需要引入Math.ceil这个方法,Math.ceil 表示大于或等于给定数字的最小整数.

    再举个栗子
    Math.ceil(.95); // 1 Math.ceil(4); // 4 Math.ceil(7.004); // 8 Math.ceil(-0.95); // -0 Math.ceil(-4); // -4 Math.ceil(-7.004); // -7

  4. 那么有了最关键的部分,接下来就是分割数组了,这个方法比较常用就用Array.prototype.slice 方法实现,通过循环把分割的数组一个一个传到一个新数组中去.
  5. 大致思路就是这样,接下来再次有请源码上场:

function chunk(array, size) {size = Math.max(size, 0); // 寻找一组数中最大的值const length = array == null ? 0 : array.length; // 定义length的值 即array的length值if (!length || size < 1) {return []; // 如果length 为0 或者size 小于1的话 返回一个空数组}let index = 0;  //定义index,用于保存分割值let resIndex = 0; // 定义resIndex,用于保存数组下标const result = new Array(Math.ceil(length / size)); //定义一个 result 是一个只有数组长度的数组,通过length和size确定分割后数组的长度while (index < length) {result[resIndex++] = slice(array, index, (index += size)); // slice()方法 与原生Array.prototype.slice()用法一样// 分析一下: array:[0,1,2],size 1 为例 那么 length:3// result[0] = [0,1,2].slice(0,1) 即 result[0] =[0] ;index=1 resIndex = 1// while(1<3) result[1] = [0,1,2].slice(1,1+1) result[1] = [1] ;index = 2 resIndex = 2// while(2<3) result[2] = [0,1,2].slice(2,2+1) result[2] = [2] ;index = 3 resIndex = 3// while(3<3) 结束循环}return result; // 返回最终的数组
}

自己试(can)着(kao)写一个

function chunk (array, size) {var length = array.lengthif (!length || !size || size < 1) {return []}var index = 0var resIndex = 0var result = new Array(Math.ceil(length / size))while (index < length) {result[resIndex++] = array.slice(index, (index += size))}return result
}console.log(chunk([1, 2, 3], 1)) // [[1], [2], [3]]console.log(chunk([1, 2, 3, 4], 2)) // [[1, 2], [3,4]]console.log(chunk([1, 2, 3, 4], 3)) // [[1, 2, 3], [4]]

最后

这样一步一步的分析,其实也不(tai)难(nan)。从网上参考了一些资料,对我解读源码有很大的帮助。最后由衷的感谢:lodash源码解析——chunk函数这篇文章对我的帮助,写的通俗易懂

转载于:https://www.cnblogs.com/tarosun/p/8372390.html

相关文章:

使用相对路径时,./、../、../../,代表的什么?

./ 当前目录。../ 父级目录。/ 根目录。 举个栗子&#xff1a; 页面引入js、css等文件&#xff1a; 1.如果about.jsp页面想引入common.css文件&#xff1a; 以about.jsp为基点寻找 直到 和static文件在同一级&#xff1b; 2.如果引入的外部css、js文件又引入image等时&#x…

asyncawait

简单理解 async async就是将方法变成异步 await 是等待异步方法的执行完成&#xff0c;可以获取异步方法里面的数据&#xff0c;但必须得用在异步方法(async)里面 创建异步方法 定义一个普通方法&#xff0c;返回值是一个字符串 function getData() {return 这是一个数据;}co…

引起路由器重启的“元凶”

文章出处&#xff1a;www.net1980.com在我们的日常维护中&#xff0c;偶然会遇到一些路由器自动重启的故障。那么大家都会自然地猜测到是否设备已经运行一段长时间&#xff0c;设备稳定性开始减低。或者可能有工作人员把电源拨松了&#xff0c;又或者设备负荷过重等原因。那么究…

python csv.reader参数指定

转载于:https://www.cnblogs.com/mahailuo/p/8375997.html

xBIM 实战01 在浏览器中加载IFC模型文件

系列目录 【已更新最新开发文章&#xff0c;点击查看详细】 一、创建Web项目打开VS&#xff0c;新建Web项目&#xff0c;选择 .NET Framework 4.5选择一个空的项目新建完成后&#xff0c;项目结构如下&#xff1a; 二、添加webServer访问文件类型由于WexXplorer 加载的是 .w…

node 判断文件夹是否存在

判断文件夹是否存在 let filePath path.join(__dirname,../)/download_tmp/fs.exists(filePath, function(exists) {if(!exists){fs.mkdir(filePath,function (err) {if(err){console.log(err)}})}});生成excle文件到本地 业务要求&#xff1a;生成excle文件到本地的路径 #安装…

IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)

以下代码在IE8下运行通过&#xff0c;在IE9中出错&#xff1a;document.createElement(<iframe id"yui-history-iframe" src"../../images/defaults/transparent-pixel.gif" style"position:absolute;top:0;left:0;width:1px;height:1px;visibilit…

数字家庭开发者中心

数字家庭开发者中心 http://www.adobe.com/devnet/devices/digital_home.html转载于:https://www.cnblogs.com/kobo/archive/2010/07/06/1772136.html

LeetCode 1021:Remove Outermost Parentheses

C语言 char * removeOuterParentheses(char * S){int len strlen(S);int j 0;int sum 0;for(int i 0; i < len; i){if (S[i] (){sum 1;}else if (S[i] )){sum - 1;}if (S[i] ( && sum > 1){S[j] (;j;}else if (S[i] ) && sum > 0){S[j] );…

Koa实现下载excel

Koa实现下载excel #安装 node-xlsx npm install node-xlsx --save实现思路&#xff1a;将生成的excel文件流返回到前端 routes router.get(/mp/push_excle, async (ctx, next) > {await Push.pushGroupExcel(ctx).then(function(res) {// let path resctx.set(Content-Ty…

使用 雨林木风 Ghost XP SP3 装机版 YN9.9 安装 Win7 (SP1)

下载Win7 SP1一段时间了&#xff0c;一直没来安装&#xff0c;今天来安装&#xff0c;由于没有DVD刻录机&#xff0c;不能做成光盘安装发现还不是那么方便。后面想到用雨林木风PE光盘来安装&#xff0c;一步一步 【下面假设是将Win7 (SP1) 将要安装到 C: 盘中】 首先使用 雨林木…

2010中国大陆×××指南,满足你的欲望!

中国大陆指南&#xff0c;满足你的欲望&#xff01; 川渝--椒麻鸡,怪味鸡,棒棒鸡,口水鸡,罐罐鸡,辣子鸡 广东--太爷鸡,越秀鸡,花雕鸡,板栗焖仔鸡,客家盐局鸡,湛江鸡,清远鸡广西--桂林黄焖鸡,梧州纸包鸡,啤酒鸡,泉水鸡 山东--沂蒙光棍鸡,德州扒鸡 云南--汽锅鸡,柴把鸡 贵州-…

iframe元素內嵌页面如何去掉继承的html及body背景色/背景图片

【1】去掉背景色&#xff1a;添加如左的样式 filter:Chroma(Colorwhite); <iframe name"Conframe" id"Conframe" name"back" style"background:#2397E2filter:Chroma(Colorwhite)"></iframe> 转载于:https://www.cn…

ListView style

步骤一&#xff1a;在使用的ListView的activiey里使用android&#xff1a;theme“style/Theme的名字” 步骤二&#xff1a;创建Themes.xml 在Themes.xml里定义的使用的样式。如&#xff1a; 步骤三&#xff1a;在themes.xml使用了styles.xml定义的listView的属性&#xff0c;创…

数据结构和算法-栈

栈可以分为 顺序栈: 数组实现链式栈: 链表实现空间复杂度 栈的空间复杂度: 有一个n个元素的栈, 在入栈和出栈过程中, 只需要存储一个临时变量存储空间, 所以空间复杂度是O(1) 并不是说栈有n个元素, 空间复杂度就是O(n), 而是指除了原本的空间外, 算法需要的额外空间 栈要满足后…

nodejs 根据坐标 标记图片上的姓名列

1.安装 npm install canvas或者使用cnpm install canvas var { createCanvas, loadImage } require(canvas);function drawImageRemark(imgurl,rects,res) {loadImage(imgurl).then((image) > {console.log(image.width)const canvas createCanvas(image.width, image.h…

以太网控制芯片DM9000在2440裸机上终于能正确接收数据了(源代码工程已经上传)...

以太网控制芯片DM9000在2440裸机上终于能正确接收数据了&#xff08;源代码工程已经上传&#xff09; (411.47 K) 该附件被下载次数 168 弄了几天DM9000了&#xff0c;一直不能正确接收数据&#xff0c;郁闷了几天&#xff0c;现在终于行了&#xff0c;高兴一下。 参考了这篇…

ajax post 参数说明

转载于:https://www.cnblogs.com/LuoEast/p/8395086.html

Struts2 2.5版本新配置filter-class

在web.xml 默认代码&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://xmln…

正则表达式收集

允许为纯英文&#xff0c;数字和汉字及其组合 /^[a-z0-9A-Z\u4e00-\u9fa5]$/ 微信账号 /^(?!_;)(?!.*?_$)[a-zA-Z0-9_;-]{4,23}$/ openid由28位数字或下划线组成 /^(?!_)(?!.*?_$)[a-zA-Z0-9_-]{28}$/

小D学blend-----如何创建自定义的Tooltip控件

运行环境&#xff1a;blend 4.0或者blend 3.0 silverlight 3.0&#xff08;其实我相信步骤应该是差不多的&#xff09; 语言&#xff1a;C# Tooltip类:它是表示一个长方形的小弹出窗口&#xff0c;该窗口在用户将指针悬停在一个控件上时显示有关该控件用途的简短说明。<p&g…

保护SNMP协议服务安全的三个步骤

在启用了SNMP协议服务 情况下&#xff0c;我们如何来确保这个协议的安全呢&#xff1f;首先我们要及时更新这个协议的补 丁&#xff0c;之后还要对这个协议的流程进行过滤。那么具体的实施情况请从下文我们来了解一下吧。 保障SNMP的安全如果某些设备确实有必要运行SNMP,则必须…

使用Python命令创建jenkins的job

目的&#xff1a;通过调用jenkins的命令&#xff0c;动态创建jenkins的job 如何使用&#xff0c;使用Python的脚本&#xff0c;更多API可以进入到官网去查看&#xff0c;http://jenkinsapi.readthedocs.io/en/latest/ 使用Python调用jenkinsAPI&#xff0c;首先需要安装包&…

sublime运行错误

这是由于没有保存文档导致说明&#xff1a;[Finished in 19.4s with exit code 1]-表示执行时间[shell_cmd: python3 -u "/Volumes/B/我的工作文档/case/superman_wap/进单/MSjindan.py"]-表示执行的shell命令[dir: /Volumes/B/我的工作文档/case/superman_wap/进单]…

js 使用filter过滤多重数组

过滤如下数据 var comment_list [{"content":"1111","status":1,"sub_comment_list":[{"content":"11111111","status":1,}] }, {"content":"2222","status":1,"…

一步一步实现自己的模拟控件(9)——消息处理

这次我们将要给Widget增加一些状态&#xff0c;并使其能够接受出消息处理扩展&#xff0c;测试工程中实现了一个按钮的消息处理扩展。 Widget状态&#xff1a; 之前的控件只是绘制了一个边框&#xff0c;并且总是会在窗口中显示。实际上我们往往会希望能够让某个控件显示或者隐…

TWAIN Specification Chapter 4 “Advanced Application Implementation”译——应用程序端的高级实现...

本文是对TWAIN规范的第四章《应用程序端的高级实现》的翻译。因工作需要了解TWAIN&#xff0c;所以顺便译了一下。这是私人工作&#xff0c;您可以参考&#xff0c;但本人不保证不存在翻译的差错或不合宜。如果您发现有不妥的地方&#xff0c;敬请告之我(yedaoq126.com)。 4.1 …

WC2018 CCF程序设计教学比赛记事

WC2018 d5 教师比赛日 亦或者称之为以“递归”为主题的同课异构课程&#xff08;25节课 有8节讲递归&#xff09; 发现强省或者弱省中名校派出的选手还是非常优秀的&#xff0c;这种优秀&#xff0c;从他的教态、自信程度、知识广度都可以看出&#xff0c;但是鉴于是CCF第一…

linux 操作系统级别监控 df 命令

df命令可以查看当前系统磁盘空间的使用情况 命令&#xff1a;df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够&#xff0c;需清理磁盘 磁盘速度测试&#xff0c;如果磁盘性能不好&#xff0c;性能测试数据会不准确&#xff08;读写速度&#xff09; 命令&#xff1a…

本地清除电脑缓存后,mongodb数据库无法连接

"C:\Program Files\MongoDB\Server\4.2\bin\mongod.exe" --dbpath "D:\worksoftware\MongoDB\Server\4.2\data" mongod安装的目录---dbpath mongod数据存放位置