答案:2015年12月9日
就我个人而言,我发现公认的答案既简洁(好)又简洁(坏)。欣赏这个说法可能是主观的,所以请阅读这个答案,看看你是否同意
问题中给出的例子类似Ruby的例子:
x.times do |i|
do_stuff(i)
end
在JS中使用下面的方法来表达这一点将允许:
times(x)(doStuff(i));
代码如下:
let times = (n) => {
return (f) => {
Array(n).fill().map((_, i) => f(i));
};
};
就是这样!
简单的示例用法:
let cheer = () => console.log('Hip hip hooray!');
times(3)(cheer);
//Hip hip hooray!
//Hip hip hooray!
//Hip hip hooray!
或者,下面是被接受的答案的例子:
let doStuff = (i) => console.log(i, ' hi'),
once = times(1),
twice = times(2),
thrice = times(3);
once(doStuff);
//0 ' hi'
twice(doStuff);
//0 ' hi'
//1 ' hi'
thrice(doStuff);
//0 ' hi'
//1 ' hi'
//2 ' hi'
边注-定义一个范围函数
一个类似的/相关的问题,使用基本非常相似的代码结构,可能是(核心)JavaScript中是否有一个方便的范围函数,类似于下划线的范围函数。
创建一个包含n个数字的数组,从x开始
下划线
_.range(x, x + n)
ES2015
一些替代方案:
Array(n).fill().map((_, i) => x + i)
Array.from(Array(n), (_, i) => x + i)
演示使用n = 10, x = 1:
> Array(10).fill().map((_, i) => i + 1)
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
> Array.from(Array(10), (_, i) => i + 1)
// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
在我运行的一个快速测试中,使用我们的解决方案和doStuff函数,上述每个方法都运行了一百万次,前一种方法(Array(n).fill())被证明略快一些。