随笔分类 - 一天一个函数实现
1
摘要:貌似闲置了两周没写了。 这次直接完成util系列的方法,在实现array系列的时候,开始发现一些示例用了其他utils,所以就不完全按顺序来实现,而且在实现过程中发现,其实有些方法其实是另一个方法的进阶使用。 这次主要实现了除match、mixin几个还没理解透的函数。 简单方法: function
阅读全文
摘要:前面说unzip其实就是数组转置,那其实zip也就是逆向,那还是转置了 导致zipObjectDeep费了点脑细胞,写了个勉强过了官方文档示例的实现。 function zip(...arr){ const result = []; arr.forEach((item, index)=>{ if(i
阅读全文
摘要:unzip是zip的逆向操作,但zip还没实现呢,先理解一下unzip,可以理解为二维数组的转置吧。 without则是和pull类似,只是它返回一个新的数组。 function unzip(arr){ const result = []; arr.forEach((item, index)=>{
阅读全文
摘要:xor 数组类异或,其实是找出一堆数组里面,只出现一次的元素集合。 所以在最开始实现时,我的逻辑是,所有数遍历一次组合起来,并且记录每个元素出现的次数,再遍历一次全部,只把出现一次的元素丢到结果里返回。 上述想法是可以实现,但后续要实现xorBy和xorWith就有点不方便. 查看了下lodash源
阅读全文
摘要:union将传入的参数数组进行合并,生成一个新数组,虽然这种用map来做可能快一些吧,但不能保证元素加入的顺序,所以可以考虑通过遍历的方式,不断从收集的数组里查找遍历到的元素是否存在,不存在则加入(打不过就加入)。 function union(...arrs){ return arrs.reduc
阅读全文
摘要:uniq数组去重,只保留第一次出现的元素,也就是要保证元素的顺序,刚实现的union利用数组遍历来做,实际uniq也可以这么搞。 function uniq(arr){ return arr.reduce((pre, cur)=>{ if(!pre.includes(cur)) { pre.push
阅读全文
摘要:tail是很简单的函数方法了,就是返回数组除了开头元素外的数组。 take则是从数组中挑出指定个数的元素组成数组。 takeRight则是往后开始挑元素。 takeWhile则是根据传入的函数来判断,直到函数返回falsey时,结束挑选。 function tail(arr){ return arr
阅读全文
摘要:sortedUniq 和 uniq很像(uniq还没讲到就已经开始说sortedUniq了) 将排好序的数组去重,因为数组本身就排序了,那就好办了,遍历数组,重复的元素只会是连续的,所以只要用一个变量记录遍历时经过的不同数,下一个遍历只要遇到不同的数,就推入结果,并赋值给变量即可。 function
阅读全文
摘要:拖了一周了,上周一直在忙(其实是sortedIndex没咋理解好) sortedIndex 从有序数组中找到指定数该插入的位置,用的是二分法的方式解决。 有两个关键点:有序数组,二分法 所以实现上是这样的: function sortedIndex(arr, value){ let head = 0
阅读全文
摘要:又遇到简单的函数实现了 remove 移除数组中命中的元素,并返回移除元素组成的数组,会改变原数组。 和pullAt有点像 function remove(arr, iteratee){ const removes = []; for(let i=0;i<arr.length;i++){ if(it
阅读全文
摘要:pull 从数组中剔除指定的元素,方法会改变数组 function pull(arr, ...rest){ for(let i=0;i<arr.length;i++){ if(rest.includes(arr[i])) { arr.splice(i, 1); i--; } } return arr
阅读全文
摘要:这次的几个就更简单了。 function join(arr, separator=",") { return arr.join(separator) } function last(arr) { return arr.length?arr[arr.length-1]:undefined } func
阅读全文
摘要:intersection 这个和前面写的difference反过来,difference是求未出现过的,intersection是求出现过的,所以实现起来就比较简单了。 function intersection(arr, ...rest){ const left = rest.reduce((pr
阅读全文
摘要:fromPairs 它是toPairs的反转,不过现在是数组函数系列还没走到toPairs。 它接收一个二维数组,元素是一个两元素的数组,一个是key,一个是value 所以实现很简单 function fromPairs(arr){ const map = {}; arr.forEach(item
阅读全文
摘要:flatten 数组元素铺平一层 function flatten(arr){ return arr.reduce((pre, cur)=>{ return pre.concat(cur) }, []) } flattenDeep 数组元素全部铺平,采用递归的方式,当遇到元素为数组时,继续调用函数来
阅读全文
摘要:把arr数组中从start到end(不包括end)用value填充 function fill(arr, value, start = 0, end = arr.length) { for(let i = start;i<end;i++) { arr[i] = value; } return arr
阅读全文
摘要:drop 将数组头部的n个元素丢弃,返回一个新的数组 // 默认n为1 function drop(arr, n = 1) { if(n<0){ throw new Error('n must be positive'); } return arr.slice(n); } dropRight 和dr
阅读全文
摘要:difference 从第一个参数数组中找出后面参数数组里未出现的元素,组成新的数组返回 function difference(arr, ...rest) { // 扁平化rest const target = rest.reduce((pre, cur) => { return pre.conc
阅读全文
摘要:最近常用的几个keyBy、groupBy和find keyBy将数组以某个元素属性作为key整理成字典 groupBy类似keyBy但字典value是数组,类型分组 find从数组中找到匹配的元素,虽然用数组filter方法也可以,但是filter是过滤,如果匹配返回的永远是数组。find返回的是匹
阅读全文
摘要:从数组系列开始-chunk和compact chunk给数组分组 按size设步长来遍历组装 function chunk(arr, size){ const result = []; // 小于1,下面循环会有问题,也不合理 if(size<1){ return []; } for(let i=0
阅读全文
1