美文网首页
Lodash 源码阅读 —— chunk

Lodash 源码阅读 —— chunk

作者: 就想叫菜鸟 | 来源:发表于2018-06-03 23:59 被阅读0次

Lodash 源码阅读 —— chunk

这里我先给出源码:

 /**
 * 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.
 *
 * @static
 * @memberOf _
 * @since 3.0.0
 * @category Array
 * @param {Array} array The array to process.
 * @param {number} [size=1] The length of each chunk
 * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
 * @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, guard) {
  if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
    size = 1;
  } else {
    size = nativeMax(toInteger(size), 0);
  }
  var length = array == null ? 0 : array.length;
  if (!length || size < 1) {
    return [];
  }
  var index = 0,
      resIndex = 0,
      result = Array(nativeCeil(length / size));

  while (index < length) {
    result[resIndex++] = baseSlice(array, index, (index += size));
  }
  return result;
}

下面是分片段来解读:

if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
    size = 1;
} else {
    size = nativeMax(toInteger(size), 0);
}
@param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
  • 这一段代码的意思是说,如果传入 guard,判断 isIterateeCall(array, size, guard),如果为 true,size = 1,如果为 false,则取 size 和 0 中的较大值。如果没有传入 guard,判断 size 是否为 undefined,如果是,size = 1,如果不是,取 size 和 0 中的较大值。
  • 划重点!!! 我并不知道 guard 怎么用 TAT
var length = array == null ? 0 : array.length;
// 判断 array 是不是为空,如果是,length = 0;如果不是, length = array.length;
if (!length || size < 1) {
    return [];
}
// 这里判断如果 length = 0 或者 传入的 size 为负数或者0;就返回空数组。
  • 下面是核心的代码:
var index = 0,
  resIndex = 0,
  result = Array(nativeCeil(length / size));
  // 这里的 nativeCeil,就是 Math.ceil(); 
  while (index < length) {
    result[resIndex++] = baseSlice(array, index, (index += size));
  }
  return result;
}
  • Math.ceil():该函数并不是四舍五入,而是向上取整,即 Math.ceil(1.333) = 2
  • baseSlice(): 由原生的 Array.prototype.slice()而来。
[1, 2, 3, 4, 5, 6].slice(0, 2); // [1, 2]
// array.slice(begin, end); 包含 begin,但是不包含 end
  while (index < length) {
    result[resIndex++] = baseSlice(array, index, (index += size));
  }
  return result;
  
 // _.chunk(['a', 'b', 'c', 'd'], 3);
 // => [['a', 'b', 'c'], ['d']]
 // 用上面这个举例来讲:
 // result = new Array(Math.ceil(4/3));
 // result = [undefined, undefined]
 // 第一轮循环:
 // index = 0; length = 4; size = 3; resIndex = 0; baseSlice(array, 0, 3);
 // result = [['a', 'b', 'c'], undefined];
 // 第二轮循环:
 // index = 3; length = 4; size = 3; resIndex = 1; baseSlice(array, 3, 6);
 // result = [['a', 'b', 'c'], ['d']] 
 // index = 6, 大于 length, 进不去第三轮的循环,到此结束。

相关文章

  • Lodash 源码阅读 —— chunk

    Lodash 源码阅读 —— chunk 这里我先给出源码: 下面是分片段来解读: 这一段代码的意思是说,如果传入...

  • lodash源码之chunk

    1、使用场景 _.chunk(array, [size=1])将数组(array)拆分成多个 size 长度的区块...

  • Lodash源码解析-_.chunk

    将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组。 如果array 无法被分割成全...

  • lodash源码分析-- chunk函数实现

    _.chunk函数 我的实现 别人的实现 对比 1.我觉得这一次我的耗时应该比较少吧。哈哈哈哈哈,因为只循环了一遍...

  • Lodash

    Lodash-Array Array _.chunk按照一定的长度将数组均匀切割成 chunk,将切割后的 chu...

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

    function chunk(array, size, guard)创建一个元素数组,按照“size”的长度分组。...

  • Lodash 源码阅读 —— concat

    Lodash 源码阅读 —— concat 该方法的作用是:创建一个新的数组,将 array 与任何数组或值连接在...

  • lodash源码阅读(1)

    Array methods 1、chunk.js 这段代码的思路是先判断子数组的个数,即结果数组的长度。接着对每个...

  • lodash源码阅读 —— difference

    lodash 源码阅读 —— difference 该方法是用于过滤,第一个参数是需要过滤的数组,第二个参数是需要...

  • Lodash源码解析 Part1:Array、Collectio

    Lodash源码解析 Part1:Array、Collection lodash究竟做了什么?封装封装可能会用到但...

网友评论

      本文标题:Lodash 源码阅读 —— chunk

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