给定一个数字而不是一个数组的函数循环

14

假设我手头有一个数字18,而不是一个包含18个元素的数组。

那么,在JS中,如果要创建一个基于数字X的功能性循环,最好的方法是什么?

我可以这样做:

[1,2,3].forEach(function(){

));

但如果我有数字3

我可以做

for(var i = 0; i < 3; i++){

}

但我希望那个循环是可运行的


2
我们已经超越了函数式编程,现在正在使用生成器。回到for语句! - user663031
1
@torazaburo ,我不确定他是否问了与您标记的重复问题相同的问题,我想他只是想要在不创建数组或使用for循环的情况下迭代x次。不确定也许。 - AJS
1
JSBIN - AJS
以“函数式方式”迭代n次,在实际应用中与创建一个包含n个数字的数组,然后在结果上使用一些迭代类型函数(如mapforEach)是相同的,因此,我会说这是重复的。 - user663031
3个回答

13

如果你有一个数字并想创建循环,那么可以在for循环的限制条件中使用该数字。

for(var i = 0; i < number; i++)

Edit 1: 只能对数组使用foreach,在这种情况下,您可以创建一个具有该长度的数组,然后在其上使用foreach

var foo = new Array(number).fill(0);

foo.foreach()

还有另一种选项

var N = 18;

Array.apply(null, {length: N}).map(Number.call, Number)

结果为 [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]

在此主题中还有许多其他选项Create a JavaScript array containing 1...N


1
是的,但我正在寻找一种函数式for循环等 :) - Alexander Mills
2
@AlexMills,意思是“forEach”风格的调用吗? - Matt
@AlexMills 你说的函数式for循环是什么意思?我以前从没听说过。也许一些相关链接会有所帮助。 - Rajshekar Reddy
2
Array.apply(null, Array(number)).map(function () {}).forEach(...) 这是最接近的方法。 - Matt
1
实际上,new Array(5).forEach 不会做你想要的事情。 - user663031
显示剩余3条评论

7

我不明白为什么你想这样做。

[1,2,3].forEach(function(){ ... ));

Is

var limit = n;
while (--limit) {(  // Note: 0 is falsy
    function(){ ... }
)(limit);}

如果你真的想使用数组结构,以下内容可以实现:

new Array(limit).fill(0).forEach(function(){...});

您可能会对当下的神话:函数式编程者不使用循环感兴趣。


注意,.fill 是 ES6 中的新功能,因此可能尚未在所有现代浏览器上得到支持。 - Matt
1
因为我需要将索引的值传递给函数。 - Alexander Mills
我认为这是限制,而不是无限制。 - Alexander Mills
@AlexanderMills - 是的,limit--。 OP 没有使用索引,但如果需要,那么 limit 递减,n-limit 递增。 - RobG
通常,for循环会触发函数式程序员,因为除非你只是在执行“fire and forget” I/O,否则几乎总会有副作用...但是,map/filter可以吗? - Alexander Mills
1
@AlexanderMills - 当然,使用适合的工具即可。我不会固守某种编程范式,只会使用看起来最合适的方法。对我而言,创建一个由x个元素组成的数组,仅仅为了循环x次去执行完全无关的操作,比使用一个包含x次迭代的for/do/while循环更不吸引人。至于意外的副作用,考虑到ECMAScript有块级作用域,这实际上并不是问题,在我看来。 :-) - RobG

1
根据这个问题,你可以使用以下方法相对容易地在线性序列上进行“功能性”迭代:
Array.apply(null, Array(number)).map(function () {}).forEach(...)

虽然这是一个巧妙的技巧,但我不确定它相对于使用索引的常规 for 循环有何优势。


我认为优点在于代码比 while(i--)... 更多;-) - RobG
公平地说,while(i--)是一个反向线性序列 :) - Matt
如果索引很重要(在原帖中并不重要),那么可以使用while (++i < limit) ...或者do ... while(i++ < limit)等方式。 - RobG
这很公平。我认为我们现在有点跑题了。 - Matt
索引在 OP 中确实很重要 :) - Alexander Mills

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接