前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lodash源码分析之_.range

lodash源码分析之_.range

作者头像
j_bleach
发布2019-07-02 11:46:06
6190
发布2019-07-02 11:46:06
举报

版权声明:本文为博主原创文章,未经博主允许不得转载。 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!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年05月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 何为_.range
  • 源码分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档