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

var foo = [];

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

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


当前回答

“_”.重复(5).拆分(“”).映射((_,i)=>i+1)将产生[1,2,3,4,5]

其他回答

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]并映射到键上,将字符串转换为数字。

只是另一个ES6版本。

通过使用Array.from第二个可选参数:

Array.from(arrayLike[,mapFn[,thisArg]])

我们可以从空数组(10)位置构建编号数组:

Array.from(Array(10), (_, i) => i)

var arr=数组.来自(数组(10),(_,i)=>i);文档.写入(arr);

我能产生的最少代码:

for(foo=[x=100]; x; foo[x-1]=x--);
console.log(foo);

使用ES2015/ES6排列运算符

[...Array(10)].map((_, i) => i + 1)

console.log([…数组(10)].map((_,i)=>i+1))

似乎目前唯一没有出现在这个相当完整的答案列表中的味道是一个生成器;以便补救:

const gen = N => [...(function*(){let i=0;while(i<N)yield i++})()]

其可以这样使用:

gen(4) // [0,1,2,3]

这件事的好处是你不需要增加。。。要从@igor shubin给出的答案中获得灵感,您可以非常容易地创建一系列随机数:

const gen = N => [...(function*(){let i=0;
  while(i++<N) yield Math.random()
})()]

而不是像这样的冗长的运营成本高昂的事情:

const slow = N => new Array(N).join().split(',').map((e,i)=>i*5)
// [0,5,10,15,...]

您可以改为:

const fast = N => [...(function*(){let i=0;while(i++<N)yield i*5})()]