美文网首页
2022-04-06 lodash源码学习 - chunk

2022-04-06 lodash源码学习 - chunk

作者: 网恋被骗二块二 | 来源:发表于2022-04-06 20:32 被阅读0次

function chunk(array, size, guard)
创建一个元素数组,按照“size”的长度分组。
如果 array 不能被平均分割,最后的块将是剩余的元素。

@param {Array} array The array to process.
要处理的数组

@param {number} [size=1] The length of each chunk
每个块的长度,默认 size 等于 1

@param- {Object} [guard] Enables use as an iteratee for methods like _.map.
允许用作 _.map 等方法的迭代对象。(可选参数)

function chunk(array, size, guard) {
        // guard 判断是否用作调用 map 等迭代
        // 一般按照使用的话是没有第三个参数的,所以 if 的判断直接来到 size === undefined ?
        // 如果不传参数,那么 if 条件满足,size 取默认值1
        if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
          size = 1;
        } else {
          // 如果传递了 size 参数,这时候调用 _.toInteger 将 size 转化成整数,因为无可避免用户会输入其他类型的参数
          // nativeMax = Math.max 转化后的 size 和 0 相比较,取两者之间最大值
          size = nativeMax(toInteger(size), 0);
        }
        // 获取数组的长度 length
        var length = array == null ? 0 : array.length;
        // 判断 length 和 size,如果数组不存在或者 size 参数错误,则返回空数组
        if (!length || size < 1) {
          return [];
        }
        // 初始化变量,index[下标]、resIndex[result 结果的下标]、result[结果数组]
        var index = 0,
            resIndex = 0,
            // Array(nativeCeil(length / size))
            // nativeCeil = Math.ceil() 向上取整
            // 这一步的作用是生成一个有确认长度结果数组
            result = Array(nativeCeil(length / size));
        // 循环
        while (index < length) {
          // 对 result 的每一项重新赋值
          // 调用 _.baseSlice 进行数组裁剪
          // 首先传参中,第三个参数 index += size 不仅给出了 baseSlice 需要的 end[结尾下标] 参数,也对 index 做出了修改
          result[resIndex++] = baseSlice(array, index, (index += size));
          // 下次 index < length 时,index 的值便成了 += size 后的结果
        }
        return result;
      }

总结

  1. 对 size 参数作处理,如果 size 不存在则默认为 1,若 size 存在,则取整且和 0 比较取最大值;
  2. 获取数组长度,若数组不存在,则长度为 0;
  3. 判断长度是否存在,或size是否小于1(这一步第一个条件是判断数组是否存在,第二个条件是 size 参数是否合法);
  4. 创建变量,原数组下标、新数组下标、用长度/size生成的新数组
  5. 遍历,新数组每项赋值截取后的内容

相关文章

网友评论

      本文标题:2022-04-06 lodash源码学习 - chunk

      本文链接:https://www.haomeiwen.com/subject/ejkdsrtx.html