我正在寻找以下方法的任何替代方法,以创建包含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);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
表演
今天2020.12.11我在Chrome v87、Safari v13.1.2和Firefox v83上对macOS HighSierra 10.13.6进行了测试,以确定所选的解决方案。
后果
适用于所有浏览器
解决方案O(基于while)是最快的(除了Firefox for big N-但在那里很快)解决方案T在Firefox上最快解M,P对于小N很快溶液V(lodash)对于大N是快速的对于小N,溶液W、X是缓慢的溶液F缓慢
细节
我执行两个测试用例:
对于小N=10-您可以在这里运行对于大N=1000000,您可以在此处运行
下面的片段展示了所有测试的解决方案ABCDEFGH我JKLMNOPQRSTU五、W十、
函数A(N){return Array.from({length:N},(_,i)=>i+1)}函数B(N){return Array(N).fill().map((_,i)=>i+1);}函数C(N){return Array(N).jjoin().split(',').map((_,i)=>i+1);}函数D(N){return Array.from(数组(N),(_,i)=>i+1)}函数E(N){return Array.from({length:N},(_,i)=>i+1)}函数F(N){return Array.from({length:N},Number.call,i=>i+1)}函数G(N){return(数组(N)+“”).split(',').map((_,i)=>i+1)}函数H(N){return[…Array(N).keys()].map(i=>i+1);}函数I(N){return[…Array(N).keys()].map(x=>x+1);}函数J(N){return[…数组(N+1).keys()].sslice(1)}函数K(N){return[…Array(N).keys()].map(x=>++x);}函数L(N){let arr;(arr=[…数组(N+1).keys()]).shift();返回arr;}函数M(N){var arr=[];变量i=0;而(N-)arr.push(++i);返回arr;}函数N(N){变量a=[],b=N;而(b-)a[b]=b+1;返回a;}函数O(N){var a=阵列(N),b=0;而(b<N)a[b++]=b;返回a;}函数P(N){var foo=[];对于(var i=1;i<=N;i++)foo.push(i);返回foo;}函数Q(N){对于(var a=[],b=N;b-;a[b]=b+1);返回a;}函数R(N){对于(变量i,a=[i=0];i<N;a[i++]=i);返回a;}函数S(N){设foo,x;对于(foo=[x=N];x;foo[x-1]=x--);返回foo;}函数T(N){返回新的Uint8Array(N).map((item,i)=>i+1);}函数U(N){返回“_”。重复(5)。拆分(“”)。映射((_,i)=>i+1);}函数V(N){返回范围(1,N+1);}函数W(N){return[…(函数*(){让i=0;while(i<N)yield++i})()]}函数X(N){函数序列(最大值,步长=1){返回{[Symbol.iiterat]:函数*(){对于(设i=1;i<=max;i+=步长),得出i}}}返回[…序列(N)];}[A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X]。对于每个(F=>{console.log(`${f.name}${f(5)}`);})<script src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js“integrity=”sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==“crossrorigin=”匿名“></script>此代码段仅显示性能测试中使用的函数-它本身不执行测试!
下面是铬的示例结果
其他回答
Array.prototype.fill()
a = Object.keys( [].fill.call({length:7}, '' ) ).map(Number)
a.pop();
console.debug(a)
[0, 1, 2, 3, 4, 5, 6]
从1开始:
[...Array(31).keys()].map(a=>a+1)
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]
为了好玩,我想借鉴伊恩·亨利的答案。
当然,var array=new array(N);将为您提供大小为N的数组,但键和值将相同。。。。然后,要将数组缩短为M大小,请使用array.length=M…但对于一些添加的功能,请尝试:
function range()
{
// This function takes optional arguments:
// start, end, increment
// start may be larger or smaller than end
// Example: range(null, null, 2);
var array = []; // Create empty array
// Get arguments or set default values:
var start = (arguments[0] ? arguments[0] : 0);
var end = (arguments[1] ? arguments[1] : 9);
// If start == end return array of size 1
if (start == end) { array.push(start); return array; }
var inc = (arguments[2] ? Math.abs(arguments[2]) : 1);
inc *= (start > end ? -1 : 1); // Figure out which direction to increment.
// Loop ending condition depends on relative sizes of start and end
for (var i = start; (start < end ? i <= end : i >= end) ; i += inc)
array.push(i);
return array;
}
var foo = range(1, -100, 8.5)
for(var i=0;i<foo.length;i++){
document.write(foo[i] + ' is item: ' + (i+1) + ' of ' + foo.length + '<br/>');
}
上述输出:
1是第1项,共12项-7.5为第2项,共12项-16是第3项,共12项-24.5为第4项,共12项-33是第5项,共12项-41.5是第6项,共12项-50是第7项,共12项-58.5为第8项,共12项-67是第9项,共12项-75.5为第10项,共12项-84是第11项,共12项-92.5是第12项,共12项
jsFiddle示例
此函数使用自动生成的参数数组。
该函数创建一个数组,该数组中的值以大小增量开始,以大小增量结束,其中
range(start, end, increment);
每个值都有一个默认值,增量的符号无关紧要,因为增量的方向取决于开始和结束的相对大小。
如果您碰巧像我一样在应用程序中使用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]
查看本教程了解更多信息。