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

var foo = [];

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

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


当前回答

您可以使用Es6中的阵列填充和映射;就像一些人在回答这个问题时建议的那样。以下是一些示例:

Example-One: Array(10).fill(0).map((e,i)=>i+1)

Result-One: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Example-Two: Array(100/10).fill(0).map((e,i)=>(i*10)+10)

Result-Two:[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

我更喜欢这样,因为我觉得这很简单。

其他回答

最终总结报告。。Drrruummm Rolll公司-

这是在不使用ES6的情况下生成大小为N(此处为10)的数组的最短代码。Cocco上面的版本很接近,但不是最短的。

(function(n){for(a=[];n--;a[n]=n+1);return a})(10)

但这场“代码高尔夫”(用最少的源代码字节来解决特定问题的比赛)无可争议的赢家是Niko Ruotsalainen。使用数组构造函数和ES6扩展运算符。(大多数ES6语法都是有效的typeScript,但下面不是。所以在使用它时要谨慎)

[...Array(10).keys()]

试试这个

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

从1开始:

[...Array(31).keys()].map(a=>a+1)

在ES6中:

Array.from({length: 1000}, (_, i) => i).slice(1);

或者更好(没有额外的变量_,也没有额外的切片调用):

Array.from({length:1000}, Number.call, i => i + 1)

或者,如果您的列表少于256个结果,您可以使用Uint8Array来获得稍快的结果(或者,您可以根据列表的长度使用其他Uint列表,例如Uint16的最大值为65535,或Uint32的最大值4294967295等。不过,正式地说,这些类型的数组只是在ES6中添加的)。例如:

Uint8Array.from({length:10}, Number.call, i => i + 1)

ES5:

Array.apply(0, {length: 1000}).map(function(){return arguments[1]+1});

或者,在ES5中,对于map函数(类似于上面ES6中Array.from函数的第二个参数),可以使用Number.call

Array.apply(0,{length:1000}).map(Number.call,Number).slice(1)

或者,如果你在这里也反对.sslice,你可以执行上面的ES5等效操作(来自ES6),比如:

Array.apply(0,{length:1000}).map(Number.call, Function("i","return i+1"))

在v8中填充数组的最快方法是:

[...Array(5)].map((_,i) => i);

结果将为:[0,1,2,3,4]