每日打卡(一):lodash.js => _.chunk

85 阅读1分钟

简介

Lodash是一个一致性、模块化、高性能的 JavaScript 实用工具库。 里面封装了很多实用的方法(具体安装引入方法详见链接)。 接下来,让我们来看看他们是怎么实现的。

_.chunk(array, [size=1])

解释

将数组(array)拆分成多个 `size` 长度的区块,并将这些区块组成一个新数组。 如果`array` 无法被分割成全部等长的区块,那么最后剩余的元素将组成一个区块。

参数

  1. array  (Array) : 需要处理的数组
  2. [size=1]  (number) : 每个数组区块的长度

返回

(Array) : 返回一个包含拆分区块的新数组(注:相当于一个二维数组)。

例子

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

手写实现

function myChunk( arr, n ) {
    let len = arr.length
    if (len <= 0 ) return ; // 不为空数组
    let res = [] // 存放结果
    let block = [] // 每个小的区块
    while( n >= 0) { // n为区分长度  不为负值
        if( n >= len ) { // 区分长度大于数组长度时 传入数组全部输出
            res.push(arr)
        } else {  
            arr.forEach((item) => {
                block.push(item) // 向小区块里存放数据
                if (block.length === n) { // 判断小区块数组的长度 是否 等于区分长度 
                    res.push(block) // 等于 将小区块数组传入结果数组
                    block = [] // 重置小区块数组
                }
            })
            if (block.length > 0) { // 剩余的小区块不满足上一个判断条件,将其也传入结果数组
                res.push(block) 
            }
        }
        return res
    }
}

核心为数组api:forEach以及其continue语句

站在巨人肩膀上

灵感来自
forEach api

欢迎评论区赐教!