答案: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);
twice(doStuff);
thrice(doStuff);
旁注 - 定义范围函数
一个类似/相关的问题,使用基本上非常相似的代码结构,可能是是否有一个方便的范围函数在(core) JavaScript中,类似于underscore的range函数。
创建从x开始的n个数字的数组
Underscore
_.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())略微更快。