我正在寻找以下所有替代方案,以创建一个包含1到N的JavaScript数组,其中N仅在运行时才知道。
var foo = []; for (var i = 1; i <= N; i++) { foo.push(i); }
在我看来,应该有一种没有循环的方法。
如果我能得到想要的结果,则需要一个数字数组,1..n以后可以循环使用。
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/>'); }
例如,如果您不需要在数组中 存储 任何内容,则只需要一个长度合适的容器即可进行迭代……这可能会更容易。
使用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则第一种形式将变得简单
i*2,-i,1+i*2,i%2
[ ...Array(N).keys() ].map(f)
例子:
Array.from({length: 5}, (v, k) => k+1); // [1,2,3,4,5]
由于数组是undefined在每个位置初始化的,因此的值v将为undefined
undefined
v
展示所有表格的示例
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))
甚至更简单