# times
# Description
调用 iteratee n 次,每次调用返回的结果存入到数组中。 iteratee 调用入 1 个参数: (index)。
# Params
(n, iteratee)
# Return
Array
# Code
/** Used as references for various `Number` constants. */
const MAX_SAFE_INTEGER = 9007199254740991
/** Used as references for the maximum length and index of an array. */
const MAX_ARRAY_LENGTH = 4294967295
function times(n, iteratee) {
if (n < 1 || n > MAX_SAFE_INTEGER) {
return []
}
let index = -1
const length = Math.min(n, MAX_ARRAY_LENGTH)
const result = new Array(length)
while (++index < length) {
result[index] = iteratee(index)
}
index = MAX_ARRAY_LENGTH
n -= MAX_ARRAY_LENGTH
while (++index < n) {
iteratee(index)
}
return result
}
# Analyze
首先对 n 做了边界处理,如果 n 小于 1 或者 n 大于 最大安全数,则返回空数组
n 和 最大数组长度对比,取较小值作为最终结果数组的 length
while 循环遍历,result 索引对应的值则为 iteratee 处理之后的结果
对于
n
大于数组最大长度的部分也做了处理,这个时候结果虽然不存入result
数组,但是iteratee
还是要调用,所以有了以下代码index = MAX_ARRAY_LENGTH n -= MAX_ARRAY_LENGTH while (++index < n) { iteratee(index) }
但是这里有一个问题,如果去掉
index
和n
赋值那里没有问题,整个函数继续调用即可如果加上赋值的话,那么到最后调用肯定不足
n
次
# Example
console.log(times(4, (i) => i)) // [ 0, 1, 2, 3 ]