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

var foo = [];

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

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


当前回答

传统浏览器友好数组构造函数

如果您想要跨浏览器友好的解决方案,您仍然无法击败for循环。这一行仍然适用于20多年的浏览器,包括Internet Explorer 5-11(1998年至今)。

for(var arr=[],i=0;i<10;i++){arr[i]=i+1};

alert(arr);// <<< [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

否则,这在现代HTML5浏览器中有效。。。

const arr = Array(10).fill().map((v,i)=>++i)

alert(arr);// <<< [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

其他回答

如果您使用的是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);
// ➜ []

我在寻找一个功能性的解决方案,最终得到了:

function numbers(min, max) {
  return Array(max-min+2).join().split(',').map(function(e, i) { return min+i; });
}

console.log(numbers(1, 9));

注意:join().split(',')将稀疏数组转换为连续数组。

如果您碰巧像我一样在应用程序中使用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]

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

我发现了这条旧线索,因为我自己也在想同样的问题,但我想这里没有一个答案比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)可能会更快。

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

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