我正在寻找以下方法的任何替代方法,以创建包含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 from()和key()方法。
Array.from(Array(10).keys())
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
使用排列运算符的较短版本。
[...Array(10).keys()]
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
从1开始,将map函数传递给Array from(),对象具有长度属性:
Array.from({length: 10}, (_, i) => i + 1)
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
其他回答
传统浏览器友好数组构造函数
如果您想要跨浏览器友好的解决方案,您仍然无法击败for循环。这一行仍然适用于20多年的浏览器,包括Internet Explorer 5-11(1998年至今)。
for(var arr=[],i=0;i<10;i++){arr[i]=i+1};
alert(arr);// <<< [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
否则,这在现代HTML5浏览器中有效。。。
const arr = Array(10).fill().map((v,i)=>++i)
alert(arr);// <<< [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
function range(start, end) {
var foo = [];
for (var i = start; i <= end; i++) {
foo.push(i);
}
return foo;
}
然后由调用
var foo = range(1, 5);
在Javascript中没有内置的方法来实现这一点,但如果您需要多次执行,则可以创建一个非常有效的实用程序函数。
编辑:在我看来,以下是一个更好的范围函数。也许只是因为我对LINQ有偏见,但我认为它在更多情况下更有用。您的里程数可能有所不同。
function range(start, count) {
if(arguments.length == 1) {
count = start;
start = 0;
}
var foo = [];
for (var i = 0; i < count; i++) {
foo.push(start + i);
}
return 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]
查看本教程了解更多信息。
function arrGen(n) {
var a = Array(n)
while (n--) a[n] = n
return a
}
// arrGen(10) => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for(var i,a=[i=0];i<10;a[i++]=i);
a=[1、2、3、4、5、6、7、8、9、10]