# baseRange
# Description
baseRange 用来根据 start 、 end 和 step 来创建一个数组,这个数组的所有数字都在 start 和 end 之间,并且相邻两个之间的差值是 step 。 一般情况下,如果 start 比 end 小,则从小大到排序,否则从大到小排序,如果 fromRight 为 true ,则排序方式和前面相反。
# Params
(start, end, step, fromRight)
# Return
Array
# Code
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
}
# Analyze
- 首先确定数组的长度
(end - start) / (step || 1), 使用end减去start然后除以 步进的值,得到数组的长度- 因为上述结果有可能为小数,所以通过
Math.ceil进行取整 - 即使取整之后,也有可能为负数,所以通过
Math.max拿到 0 和上述结果的比较值,取其中较大的值作为length
new一个新数组,长度为length- while 循环进行数组填值
- 首先判断是否
fromRight, 如果fromRight为true,则取length作为索引,也就实现了从右到左 - 将
start的值设置给对应的索引 start加等于step的值,这里如果step为正数,则是递增,负数为递减
- 首先判断是否
# Remark
- Math.ceil() MDN (opens new window) 函数返回大于或等于一个给定数字的最小整数。
- Math.max() MDN (opens new window) 函数返回一组数中的最大值。
# Example
console.log(baseRange(-1, -10, -1)) // [-1, -2, -3, -4, -5, -6, -7, -8, -9]
console.log(baseRange(-10, -1, 1)) // [-10, -9, -8, -7, -6, -5, -4, -3, -2]
console.log(baseRange(1, 10, 2)) // [ 1, 3, 5, 7, 9 ]
console.log(baseRange(1, 10, 0)) // [ 1, 1, 1, 1, 1, 1, 1, 1, 1]
← basePullAt baseReduce →