以前作的足够多,可是不够好。批评本身的话万万千,不如真是作点小事日积月累来的实在。比起vue,react之类的大库,看的头晕,先从小库写起来吧。vue
17年但愿本身能克服不够坚持,不够认真的毛病,踏踏实实积累一点东西,远离浮躁,认真的学习,夯实基础。目标没必要太过远大,先从lodash开始。天天看一个lodash方法。react
chunk方法源码连接git
将数组(array)拆分红多个 size 长度的区块,并将这些区块组成一个新数组。 若是array 没法被分割成所有等长的区块,那么最后剩余的元素将组成一个区块。github
`_.chunk(array, [size=1])api
* chunk(['a', 'b', 'c', 'd'], 2) * // => [['a', 'b'], ['c', 'd']] * * chunk(['a', 'b', 'c', 'd'], 3) * // => [['a', 'b', 'c'], ['d']]
这是在源码里的执行效果。它接收一个数组,传入一个size,会将原数组按照size生成若干个新的数组,并组成一个数组。数组
看api文档的时候注意,[size=1],大概意思就是在不传size的状况下,size默认为1 作了个测试函数
var data = [1,2,3,4,5] console.log(_.chunk(data)) //=> [[1],[2],[3],[4],[5]]
须要注意的是thunk方法是一个纯函数。它不会对传入的data有任何影响,这很不起眼,但很重要。oop
简单分析,传入的参数有两个,第一个为数组,第二个为size,默认为1性能
function chunk(arr,size){ var size = size || 1; // var result = []; // 我这里能想到的是遍历 var l = arr.length; //数组的长度 var s = Math.ceil(l/size)// 假如咱们有长度为10的数组,size传入的是3,是要分红4个自数组的。 for(var i =0;i<s;i++){ result[i] = arr.slice(size*i,size*(i+1)) } return result } console.log(chunk(data,2))
实现的思路。若是我传入一个长度为10的数组,size为3,那么我按照每三个一组分,应该获得的结果是4个数组。10处以3再向上取整,恰好Math.ceil这个方法能知足个人须要。以后,再用一个for循环处理数组,放入个人result数组里,返回获得的result。学习
import slice from './slice.js' function chunk(array, size) { size = Math.max(size, 0) // 这里我没想明白,若是size为undefined Math.max(size)岂不是NaN了,若有大佬指出,不胜感激。 const length = array == null ? 0 : array.length //array若是不是null就取出length,不然length 为0 if (!length || size < 1) { return [] // 不是array,就直接返回一个空数组。 } let index = 0 let resIndex = 0 const result = new Array(Math.ceil(length / size))// Math.ceil(10/3) = 4 result应该为4个长度的数组。 while (index < length) { result[resIndex++] = slice(array, index, (index += size)) // while循环生成result的数组。 } return result } export default chunk
result = []
,而lodash使用的是 new Array(),这里我google一圈也没搜索到new Array()的好处。new的性能要低于 字面变量result=[]的,微乎其微。下一篇,slice方法吧。