我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。

var foo = [];

for (var i = 1; i <= N; i++) {
   foo.push(i);
}

对我来说,我觉得应该有一种不用循环的方法。


当前回答

//不分配N大小数组(ES6,带有一些流注释)的解决方案:函数*zeroToN(N/*:数字*/)/*:生成器<number,void,empty>*/{对于(设n=0;n<=n;n+=1),得到n;}//通过这一代,您可以拥有您的阵列console.log([…zeroToN(10-1)])//但是让我们定义一个助手迭代器函数函数mapIterator(迭代器,映射){常量arr=[];for(let result=iterater.next()!result.done;result=iterator.next()){arr.push(映射(result.value));}返回arr;}//现在您有了一个map函数,不需要分配0…N-1数组console.log(mapIterator(zeroToN(10-1),n=>n*n));

其他回答

使用ES6标准中的新Array方法和=>函数语法(编写时仅限Firefox)。

通过用未定义的:

Array(N).fill().map((_, i) => i + 1);

Array.from将“孔”转换为未定义,因此Array.map按预期工作:

Array.from(Array(5)).map((_, i) => i + 1)

试试看:

var foo = [1, 2, 3, 4, 5];

如果您正在使用CoffeeScript,可以通过执行以下操作创建范围:

var foo = [1..5]; 

否则,如果您使用的是普通JavaScript,那么如果要将数组初始化为可变长度,则必须使用循环。

我发现了这条旧线索,因为我自己也在想同样的问题,但我想这里没有一个答案比Kokodoko评论的原始示例更容易,哈哈!

我最终自己使用了这个方法:

var foo = [];
while (foo.length < N)
    foo.push( foo.length + 1 );

这至少比常规的for循环稍微快一点,而且希望不容易出错(尽管在计算上可能更昂贵)。

甚至可以做以下事情:

var foo= [];
while (foo.length < N)
    foo.push( foo.length%4 + 1 );

以按顺序将阵列填充1-4次。或者使用此方法用单个项填充数组,尽管我想在这种情况下,只使用array(N).fill(x)可能会更快。

Array(8).fill(0).map(Number.call, Number)

偷取Igors数字。可以使用技巧,但使用fill()稍微缩短。仅适用于ES6及以上版本。

使用不修改Number.prototype的生成器函数的可移植版本。

函数序列(最大值,步长=1){返回{[Symbol.iiterat]:函数*(){对于(设i=1;i<=max;i+=步长),得出i}}}console.log([…序列(10)])