我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
使用ES6标准中的新Array方法和=>函数语法(编写时仅限Firefox)。
通过用未定义的:
Array(N).fill().map((_, i) => i + 1);
Array.from将“孔”转换为未定义,因此Array.map按预期工作:
Array.from(Array(5)).map((_, i) => i + 1)
其他回答
ES5版本,效率很低,但可能是最短的一个,它是一个表达式,而不是一个变量填充有例如for循环的语句:
(Array(N)+'').split(',').map(function(d,i){return i})
使用ES6标准中的新Array方法和=>函数语法(编写时仅限Firefox)。
通过用未定义的:
Array(N).fill().map((_, i) => i + 1);
Array.from将“孔”转换为未定义,因此Array.map按预期工作:
Array.from(Array(5)).map((_, i) => i + 1)
我能产生的最少代码:
for(foo=[x=100]; x; foo[x-1]=x--);
console.log(foo);
如果您碰巧像我一样在应用程序中使用d3.js,d3会提供一个助手函数来为您执行此操作。
因此,要获得从0到4的数组,非常简单:
d3.range(5)
[0, 1, 2, 3, 4]
并获得从1到5的数组,如您所请求的:
d3.range(1, 5+1)
[1, 2, 3, 4, 5]
查看本教程了解更多信息。
尝试在Number的原型中添加迭代器。
Number.prototype[Symbol.iterator] = function *(){
let i = 0;
while(i < this) yield i++;
return;
}
现在数字是可迭代的,只需将一个数字传递给Array.from
Array.from(10);//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
或者任何其他需要迭代的地方,比如。。。循环。
for(const number of 10) console.log(number);//logs 0 through 9 sequentially
这有点复杂,但也很酷。