答案: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中有一个便捷的Range函数,类似于下划线的range函数。
从x开始创建具有n个数字的数组
下划线
_.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函数将以上各项运行了100万次,以前的方法(Array(n).fill())证明速度稍快。