一尘不染

JavaScript如何创建一个包含1…N的数组

javascript

我正在寻找以下所有替代方案,以创建一个包含1到N的JavaScript数组,其中N仅在运行时才知道。

var foo = [];

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

在我看来,应该有一种没有循环的方法。


阅读 2430

收藏
2020-04-25

共2个答案

一尘不染

如果我能得到想要的结果,则需要一个数字数组,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/>'); 
}

例如,如果您不需要在数组中 存储 任何内容,则只需要一个长度合适的容器即可进行迭代……这可能会更容易。

2020-04-25
一尘不染

使用ES6的多种方式

使用扩展运算符(...)和密钥方法

[ ...Array(N).keys() ].map( i => i+1);

Fill/Map

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

Array.from

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

Array.from and{ length: N }hack

Array.from({ length: N }, (_, i) => i+1)

关于广义形式的注意事项

所有上述形式通过改变初始化为几乎任何期望的值可以产生阵列i+1所需表达(例如i*2,-i,1+i*2,i%2和等等)。如果表达式可以由某些函数表示,f则第一种形式将变得简单

[ ...Array(N).keys() ].map(f)

例子:

Array.from({length: 5}, (v, k) => k+1); 
// [1,2,3,4,5]

由于数组是undefined在每个位置初始化的,因此的值v将为undefined

展示所有表格的示例

let demo= (N) => {
  console.log(
    [ ...Array(N).keys() ].map(( i) => i+1),
    Array(N).fill().map((_, i) => i+1) ,
    Array.from(Array(N), (_, i) => i+1),
    Array.from({ length: N }, (_, i) => i+1)
  )
}

demo(5)

具有自定义初始化函数的更通用的示例,f即

[ ...Array(N).keys() ].map((i) => f(i))

甚至更简单

[ ...Array(N).keys() ].map(f)
2020-04-26