本文为读 lodash 源码的第三百六十五篇,后续文章会更新到这个仓库中,欢迎 star:pocket-lodash
gitbook也会同步仓库的更新,gitbook地址:pocket-lodash
baseRange
用来根据 start
、 end
和 step
来创建一个数组,这个数组的所有数字都在 start
和 end
之间,并且相邻两个之间的差值是 step
。 一般情况下,如果 start
比 end
小,则从小大到排序,否则从大到小排序,如果 fromRight
为 true
,则排序方式和前面相反。
源码如下:
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
}
如果 step
没有传,则默认 step
为 1
。
使用 (end - start) / step
可以得到数组的个数,但是这个结果可能为小数,因此使用 Math.ceil
来取整,又因为计算出来的个数可能为负数,因此再用 Math.max
来取和 0
相比的较大值,避免出现个数为负数的情况。
使用 while
遍历,这时 length
是递减的, index
是递增的,如果 fromRight
为 true
,则使用 length
作为索引,否则使用 index
,因此 fromRight
为 true
时, 和正常的排序方式刚好相反。
每次遍历都将 start
都递加上 step
,如果 step
为正数,则递增,如果为负数,则递减。
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见:
作者:对角另一面