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

var foo = [];

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

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


当前回答

如果我得到了你想要的,你需要一个数字数组1..n,以后可以循环使用。

如果这就是你所需要的,你能代替它吗?

var foo = new Array(45); // create an empty array with length 45

然后当你想使用它时…(例如,未优化)

for(var i = 0; i < foo.length; i++){
  document.write('Item: ' + (i + 1) + ' of ' + foo.length + '<br/>'); 
}

例如,如果你不需要在数组中存储任何东西,你只需要一个长度合适的容器,你可以遍历它。。。这可能更容易。

请在此处查看实际操作:http://jsfiddle.net/3kcvm/

其他回答

我能想出的最简洁的办法是:

[...''.padEnd(N)].map((_,i)=>i+1)

尝试在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

这有点复杂,但也很酷。

对以上内容进行改进:

var range = function (n) {
  return Array(n).join().split(',').map(function(e, i) { return i; });
}  

可以获得以下选项:

1) Array.init设置为值v

var arrayInitTo = function (n,v) {
  return Array(n).join().split(',').map(function() { return v; });
}; 

2) 获得反向范围:

var rangeRev = function (n) {
  return Array(n).join().split(',').map(function() { return n--; });
};

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

通过用未定义的:

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

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

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

如果我得到了你想要的,你需要一个数字数组1..n,以后可以循环使用。

如果这就是你所需要的,你能代替它吗?

var foo = new Array(45); // create an empty array with length 45

然后当你想使用它时…(例如,未优化)

for(var i = 0; i < foo.length; i++){
  document.write('Item: ' + (i + 1) + ' of ' + foo.length + '<br/>'); 
}

例如,如果你不需要在数组中存储任何东西,你只需要一个长度合适的容器,你可以遍历它。。。这可能更容易。

请在此处查看实际操作:http://jsfiddle.net/3kcvm/