lodash源码学习-数组篇

  • 时间:
  • 浏览:
  • 来源:互联网

1,chunk

function slice(array, start, end) {
    // 1, 对参数进行处理
    let length = array == null ? 0 : array.length
    if (!length) {
      return []
    }
     // 1.1 对开始参数进行初步处理
    start = start == null ? 0 : start
    end = end === undefined ? length : end
     // 1.2 对开始参数再次进行负数异常处理
    if (start < 0) {
      start = -start > length ? 0 : (length + start)
    }
    // 1.3 对结束参数进行初步处理
    end = end > length ? length : end
    // 1.4 对结束参数再次进行负数异常处理
    if (end < 0) {
      end += length
    }
    //x >>> 0本质上就是保证x有意义(为数字类型),且为正整数,在有效的数组范围内(0 ~ 0xFFFFFFFF)
    //,且在无意义的情况下缺省值为0。一个小小的表达式,隐藏着着多重的异常处理。js真是诡异啊。
    length = start > end ? 0 : ((end - start) >>> 0)
    start >>>= 0

    let index = -1
    const result = new Array(length)
    while (++index < ßlength) {
      result[index] = array[index + start]
    }
    return result
  }

  function chunk(array, size) {
    // size默认值为1
    // 如果size小于0,取0处理,大于0,则取size值
    size = Math.max(size, 0)
    // 如果array为null,length取0,否则取array.length
    const length = array == null ? 0 : array.length
    // 如果length为0或者size小于1,返回一个空数组
    if (!length || size < 1) {
      return []
    }
    let index = 0
    let resIndex = 0
    // 用数组的长度除以size并向上取整以得到分块的个数,新建一个长度为分块个数的数组result
    const result = new Array(Math.ceil(length / size))
  
    // 下面的while循环主要做的事情是遍历array数组,每次截取array中的size个元素并将截取结果添加到result数组中
    // while循环中index从0开始,每次增加size大小,直到index大于等于length时跳出循环
    // 每次循环时,result数组中的索引resIndex加1
    // 在每次循环体中,从array中截取索引为index到(index+size)之间的元素返回一个数组,并将返回结果添加到result数组中
    // 截取array元素时使用的方法slice实现可以查看slice对应的源码分析
    while (index < length) {
      result[resIndex++] = slice(array, index, (index += size))
    }
    // 返回最终结果result
    return result
  }

 

本文链接http://element-ui.cn/news/show-367373.aspx