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

var foo = [];

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

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


当前回答

如果您碰巧像我一样在应用程序中使用d3.js,d3会提供一个助手函数来为您执行此操作。

因此,要获得从0到4的数组,非常简单:

d3.range(5)
[0, 1, 2, 3, 4]

并获得从1到5的数组,如您所请求的:

d3.range(1, 5+1)
[1, 2, 3, 4, 5]

查看本教程了解更多信息。

其他回答

如果您碰巧像我一样在应用程序中使用d3.js,d3会提供一个助手函数来为您执行此操作。

因此,要获得从0到4的数组,非常简单:

d3.range(5)
[0, 1, 2, 3, 4]

并获得从1到5的数组,如您所请求的:

d3.range(1, 5+1)
[1, 2, 3, 4, 5]

查看本教程了解更多信息。

//不分配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));

这可能是生成数字数组的最快方法

最短的

var a=[],b=N;while(b--)a[b]=b+1;

内联

var arr=(function(a,b){while(a--)b[a]=a;return b})(10,[]);
//arr=[0,1,2,3,4,5,6,7,8,9]

如果您想从1开始

var arr=(function(a,b){while(a--)b[a]=a+1;return b})(10,[]);
//arr=[1,2,3,4,5,6,7,8,9,10]

想要功能吗?

function range(a,b,c){c=[];while(a--)c[a]=a+b;return c}; //length,start,placeholder
var arr=range(10,5);
//arr=[5,6,7,8,9,10,11,12,13,14]

WHY?

while是最快的循环直接设置比推送更快[]比新阵列(10)更快它很短。。。查看第一个代码。然后看看这里的所有其他函数。

如果你喜欢,就不能没有

for(var a=[],b=7;b>0;a[--b]=b+1); //a=[1,2,3,4,5,6,7]

or

for(var a=[],b=7;b--;a[b]=b+1); //a=[1,2,3,4,5,6,7]
Array(8).fill(0).map(Number.call, Number)

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

如果您使用的是lodash,则可以使用_.范围:

_.range([开始=0],结束,[步骤=1])创建数字数组(积极和/或消极)从开始到结束,但不是包括,结束。如果指定了负启动,则使用步骤-1没有终点或台阶。如果未指定结束,则设置为开始然后将start设置为0。

示例:

_.range(4);
// ➜ [0, 1, 2, 3]

_.range(-4);
// ➜ [0, -1, -2, -3]

_.range(1, 5);
// ➜ [1, 2, 3, 4]

_.range(0, 20, 5);
// ➜ [0, 5, 10, 15]

_.range(0, -4, -1);
// ➜ [0, -1, -2, -3]

_.range(1, 4, 0);
// ➜ [1, 1, 1]

_.range(0);
// ➜ []