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

var foo = [];

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

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


当前回答

所有这些都太复杂了。只要做到:

function count(num) {
  var arr = [];
  var i = 0;

  while (num--) {
    arr.push(i++);
  }

  return arr;
}

console.log(count(9))
//=> [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]

或者从a到b的范围

function range(a, b) {
  var arr = [];

  while (a < b + 1) {
    arr.push(a++);
  }

  return arr;
}

console.log(range(4, 9))
//=> [ 4, 5, 6, 7, 8, 9 ]

其他回答

试试这个

const foo = numberOfItems=> [...Array(numberOfItems).keys()].map(i => i+1);

有一个小功能,它允许使用像[1,2]。范围(3,4)->[1,2,3,4]也适用于负参数。享受

Array.prototype.range = function(from, to)
{
   var range = (!to)? from : Math.abs(to - from) + 1, increase = from < to;
   var tmp = Array.apply(this, {"length": range}).map(function()
      {
         return (increase)?from++ : from--;
      }, Number);

   return this.concat(tmp);
};

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

这有点复杂,但也很酷。

Object.keys(Array.apply(0,Array(3))).map(Number)

返回[0,1,2]。与伊戈尔·舒宾(Igor Shubin)的出色回答非常相似,但略少了一些诡计(并且长了一个角色)。

说明:

数组(3)//[未定义×3]生成长度n=3的数组。不幸的是,这个阵列对我们几乎毫无用处,所以我们必须…Array.apply(0,Array(3))//[未定义,未定义,undefined]使数组可迭代。注意:null作为apply的第一个参数更常见,但0更短。Object.keys(Array.apply(0,Array(3)))//[“0”,“1”,“2”]然后获取数组的键(因为数组是数组的类型)。数组是带有键索引的对象。Object.keys(Array.apply(0,Array(3))).map(Number)//[0,1,2]并映射到键上,将字符串转换为数字。

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

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