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

var foo = [];

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

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


当前回答

✅ 简单地说,这对我有用:

[...Array(5)].map(...)

其他回答

Fast

这个解决方案可能是最快的——它是由lodash_.range函数启发而来的(但我的更简单、更快)

设N=10,i=0,a=阵列(N);而(i<N)a[i++]=i;控制台日志(a);

与当前(2020.12.11)相比,基于while/for的现有答案的性能优势

内存在开始时由a=数组(N)分配一次使用了增加索引i++——看起来比减少索引i快30%左右——(可能是因为CPU缓存在正向上更快)

在此答案中,使用了20多种其他解决方案进行了速度测试

在ES6中,使用Array from()和key()方法。

Array.from(Array(10).keys())
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使用排列运算符的较短版本。

[...Array(10).keys()]
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

从1开始,将map函数传递给Array from(),对象具有长度属性:

Array.from({length: 10}, (_, i) => i + 1)
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

尝试在Number的原型中添加迭代器。

Number.prototype[Symbol.iterator] = function *(){
  let i = 0;
  while(i < this) yield i++;
  return;
}

现在数字是可迭代的,只需将一个数字传递给Array.from

Array.from(10);//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

或者任何其他需要迭代的地方,比如。。。循环。

for(const number of 10) console.log(number);//logs 0 through 9 sequentially

这有点复杂,但也很酷。

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

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(',')将稀疏数组转换为连续数组。

在ES6中,您可以执行以下操作:

数组(N).fill().map((e,i)=>i+1);

http://jsbin.com/molabiluwa/edit?js安慰

编辑:更新问题后,将数组(45)更改为数组(N)。

控制台日志(数组(45).填充(0).映射((e,i)=>i+1));