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

var foo = [];

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

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


当前回答

这个问题有很多复杂的答案,但只有一句简单的话:

[...Array(255).keys()].map(x => x + 1)

此外,虽然上面的内容写起来很短(很整洁),但我认为下面的内容要快一点(最大长度:

127,国际8,

255,Uint8,

32767,国际16,

65535、Uint16、,

2147483647,国际32,

4294967295,Uint32。

(基于最大整数值),这里还有关于类型化数组的更多信息):

(new Uint8Array(255)).map(($,i) => i + 1);

虽然这个解决方案也不太理想,因为它创建了两个数组,并使用了额外的变量声明“$”(不确定使用这个方法有什么方法可以解决这个问题)。我认为以下解决方案是实现这一目标的最快方法:

for(var i = 0, arr = new Uint8Array(255); i < arr.length; i++) arr[i] = i + 1;

在该语句之后的任何时候,您都可以在当前范围中简单地使用变量“arr”;

如果你想用它做一个简单的函数(带有一些基本的验证):

功能范围(最小、最大){min=min&&min.constructor==数字?最小值:0;!(max&&max.constructor==Number&&max>min)&&//布尔语句也可以用于void返回类型,如单行if语句。((最大值=最小值)&(最小值=0))//如果指定了一个“max”参数,那么首先检查它是否是一个数字,以及它是否大于min:如果是,保持不变;如果没有,那么就把它当作一开始没有“max”,“max”变为“min”(默认情况下,min变为0)对于(var i=0,arr=new(最大值<128?Int8阵列:最大值<256?Uint8阵列:最大值<32768?Int16阵列:最大值<65536?Uint16阵列:最大值<2147483648?Int32阵列:最大值<4294967296?Uint32阵列:大堆)(最大值-最小值);i<arr.length;i++)arr[i]=i+min;返回arr;}//如果需要,可以使用数组方法轻松循环range(1,11).forEach(x=>console.log(x));//或者如果你习惯了蟒蛇。。。在“你可以用”for。。。的“如果您需要单个值:对于(i范围(20202025))console.log(i);//或者如果你真的想用“for…”。。在“”中,您可以,但随后您只能访问密钥:对于(范围内的k(25,30))console.log(k);控制台日志(范围(1128).构造器名称,范围(200).构造器名称,范围(400900).结构名称,范围(33333).结构名称,范围(823100000).结构名称,range(10,4)//当“min”参数大于“max”时,它只会认为没有“max”,新的max变为“min”,“min”变为0,就好像“max”从未被写入);


因此,通过上述功能,上述超慢的“简单一行”变成了超快,甚至更短:

range(1,14000);

其他回答

你可以这样做:

var arr=数组.from(数组(10).keys())arr.shift()控制台日志(arr)

有一个小功能,它允许使用像[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);
};

比字符串变体简单一点:

// create range by N
Array(N).join(0).split(0);

// create a range starting with 0 as the value
Array(7).join(0).split(0).map((v, i) => i + 1) // [1, 2, 3, 4, 5, 6, 7]

更新(2018年1月4日):更新以解决确切的OP问题。感谢@lessless发出此消息!

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

通过用未定义的:

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

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

Array.from(Array(5)).map((_, i) => i + 1)
function arrGen(n) {
  var a = Array(n)
  while (n--) a[n] = n
  return a
}
// arrGen(10) => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]