我正在寻找以下方法的任何替代方法,以创建包含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);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
使用非常流行的Undercore_.range方法
// _.range([start], stop, [step])
_.range(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5); // => [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1); // => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0); // => []
其他回答
//不分配N大小数组(ES6,带有一些流注释)的解决方案:函数*zeroToN(N/*:数字*/)/*:生成器<number,void,empty>*/{对于(设n=0;n<=n;n+=1),得到n;}//通过这一代,您可以拥有您的阵列console.log([…zeroToN(10-1)])//但是让我们定义一个助手迭代器函数函数mapIterator(迭代器,映射){常量arr=[];for(let result=iterater.next()!result.done;result=iterator.next()){arr.push(映射(result.value));}返回arr;}//现在您有了一个map函数,不需要分配0…N-1数组console.log(mapIterator(zeroToN(10-1),n=>n*n));
ES6中还有另一种方法,使用Array.from,它接受两个参数,第一个是arrayLike(在本例中是具有长度属性的对象),第二个是映射函数(在本示例中,我们将项映射到其索引)
Array.from({length:10}, (v,i) => i)
它更短,可用于生成偶数等其他序列
Array.from({length:10}, (v,i) => i*2)
此外,这比大多数其他方式具有更好的性能,因为它只在阵列中循环一次。查看截图以进行一些比较
//打开开发控制台以查看结果计数=100000console.time(“来自对象”)for(设i=0;i<count;i++){range=Array.from({length:10},(v,i)=>i)}console.timeEnd(“来自对象”)console.time(“来自按键”)for(设i=0;i<count;i++){range=Array.from(Array(10).keys())}console.timeEnd(“来自按键”)console.time(“应用”)for(设i=0;i<count;i++){range=Array.apply(null,{length:10}).map(函数(元素,索引){return index;})}console.timeEnd(“应用”)
最终总结报告。。Drrruummm Rolll公司-
这是在不使用ES6的情况下生成大小为N(此处为10)的数组的最短代码。Cocco上面的版本很接近,但不是最短的。
(function(n){for(a=[];n--;a[n]=n+1);return a})(10)
但这场“代码高尔夫”(用最少的源代码字节来解决特定问题的比赛)无可争议的赢家是Niko Ruotsalainen。使用数组构造函数和ES6扩展运算符。(大多数ES6语法都是有效的typeScript,但下面不是。所以在使用它时要谨慎)
[...Array(10).keys()]
这可能是生成数字数组的最快方法
最短的
var a=[],b=N;while(b--)a[b]=b+1;
内联
var arr=(function(a,b){while(a--)b[a]=a;return b})(10,[]);
//arr=[0,1,2,3,4,5,6,7,8,9]
如果您想从1开始
var arr=(function(a,b){while(a--)b[a]=a+1;return b})(10,[]);
//arr=[1,2,3,4,5,6,7,8,9,10]
想要功能吗?
function range(a,b,c){c=[];while(a--)c[a]=a+b;return c}; //length,start,placeholder
var arr=range(10,5);
//arr=[5,6,7,8,9,10,11,12,13,14]
WHY?
while是最快的循环直接设置比推送更快[]比新阵列(10)更快它很短。。。查看第一个代码。然后看看这里的所有其他函数。
如果你喜欢,就不能没有
for(var a=[],b=7;b>0;a[--b]=b+1); //a=[1,2,3,4,5,6,7]
or
for(var a=[],b=7;b--;a[b]=b+1); //a=[1,2,3,4,5,6,7]
如果您碰巧像我一样在应用程序中使用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]
查看本教程了解更多信息。