lodash源码分析之_.range

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/72824386

何为_.range

lodash就不介绍了,一个处理js对象集合的工具类,有非常多实用的方法,可以大大提高工作效率,而有一些方法已经被ES6原生实现了,例如_.assign(a,b)将a,b两个对象合并等等,而今天的主角是这个:_.range_.range([start=0], end, [step=1]) _.range的作用是简单来讲,就是为它指定一个范围和步长,然后生成相对应的数组。这个函数有三个参数,start(数组开始的位置,默认为0),end(数组结束的位置,但不包含此项),step(数组的步长,默认为1,即每个item间距为1)。 例如_.range(1,4),会得到的结果是[1,2,3],参数4作为一个不包含于数组的结束位。复制一段官方示例:

_.range(4);
// => [0, 1, 2, 3]

_.range(1, 5);
// => [1, 2, 3, 4]

_.range(0, 20, 5);
// => [0, 5, 10, 15]

_.range(0, -4, -1);
// => [0, -1, -2, -3]

_.range(1, 4, 0);
// => [1, 1, 1]

_.range(0);
// => []

这个函数便于我们快速生成一个具有等差关系的数组,但是知其然不知所以然是不对的,下面去github上看一下他的源码是怎样实现的吧。滴滴学生卡

源码分析

import baseRange from './baseRange.js'
import toFinite from '../toFinite.js'

function createRange(fromRight) {
  return (start, end, step) => {
    // Ensure the sign of `-0` is preserved.
    start = toFinite(start)
    if (end === undefined) {
      end = start
      start = 0
    } else {
      end = toFinite(end)
    }
    step = step === undefined ? (start < end ? 1 : -1) : toFinite(step)
    return baseRange(start, end, step, fromRight)
  }
}

export default createRange

createRange是最终输出range的类,在这个类中,引入了两个基本类,baseRange和toFinite ,先看baseRange:

function baseRange(start, end, step, fromRight) {
  let index = -1
  let length = Math.max(Math.ceil((end - start) / (step || 1)), 0)
  const result = new Array(length)

  while (length--) {
    result[fromRight ? length : ++index] = start//默认从右至左
    start += step
  }
  return result
}

export default baseRange

这个函数传入三个参数,与range相同,[start,end,step]=[开始,结束,步长]。 fromRight:这是一个布尔值,默认是从右至左,对数组进行操作。 length为计算出来的数组长度,Math.ceil向上取整。 result创建一个该长度的稀疏数组。这时就已经完成_.range这个函数了,即创造了一个由索引组成value的数组。

toFinite.js 就是判断一个数是否有限,如果是一个无穷数,就把他置为0。

回到一开始的createRange,可以发现,之所以传入一个值时,默认为end(结束位),就是这几句

 if (end === undefined) {
      end = start
      start = 0
    } else {
      end = toFinite(end)
    }

_.range就到这里为止了,比较简单,之所以,写这篇文章缘由其实是看了一篇密集数组与稀疏数组的差别,说到,用密集数组,实现这个_.range,然后看了源码才发现,人家是用的稀疏数组,当然我试了下密集也行,即const result = new Array(length),可换成const result = Array.apply(null,{length:length})。所以,这算哪门子密集数组的应用。。MDZZ!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券