在JavaScript中使用1..20创建整数数组的最常用方法

art*_*ung 46 javascript algorithm

创建这个数组最简洁的方法是什么:

var x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
         11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
Run Code Online (Sandbox Code Playgroud)

例如,一个for循环:

var x = [];
for (var i=1;i<=20;i++) {
  x.push(i);
}
Run Code Online (Sandbox Code Playgroud)

while循环:

var x = [], i = 1, endInt = 20;
while (i <= endInt) {
  x.push(i);
  i++;
}
Run Code Online (Sandbox Code Playgroud)

是否会有其他更简洁的例子 - 换句话说 - 更少的代码?我正在考虑像Ruby这样的东西,我认为等效的代码就像这样简单1..20.我不知道JavaScript中的语法,但我想知道是否有更短的方法来做同样的事情.

更新:我没有考虑删除分号或var问题的答案,但我不得不承认这个问题意味着.我对算法比对剃须字节更感兴趣.对不起,如果我不清楚!另外,将它变成一个函数很简单,只需拍打function range(start, end) { /* guts here */ }它就可以了.问题是对"胆量"有新的方法.

nin*_*cko 71

在考虑了一下之后,这是range(N)我能想到的JavaScript中标准函数的最短实现:

function range1(i){return i?range1(i-1).concat(i):[]}
Run Code Online (Sandbox Code Playgroud)

注意:不要在生产中使用它; 它是O(N ^ 2)

与当前最高投票的答案形成对比:

function range1(i){var x=[];var i=1;while(x.push(i++)<i){};return x}
Run Code Online (Sandbox Code Playgroud)

例:

> range1(5)
[1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

这就像递归的海报孩子,虽然我期待它更长,直到我想到了三元语句,它将它带到了42个必要的字符.

请注意,range返回[start,end] 的"标准" 函数可以通过执行来编写.concat(i-1).


更新:哦,我通过滥用循环,反向排序,分配返回一个值的事实发现了一个令人难以置信的短版本,带有丑陋的命令式语法:for(y=[],i=20;y[--i]=i;){}只包含25个字符(尽管你想要var y插入到for循环中,如果你不想要0,则为+1 ... 19).虽然如果你需要定义一个函数它不会更短,但它比i?r(i-1).concat(i):[]你不需要函数更短.


喜欢的方法

2015年9月13日更新:

刚刚提出了这种新方法,它适用于支持ES6标准的浏览器:

> Array(5).fill().map((x,i)=>i)
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

这个:

> Array.from(Array(5),(x,i)=>i)
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

添加了一些性能分析测试用例:似乎除了标准有序for循环之外的所有内容都要慢10倍,至少在V8上是这样.https://jsperf.com/array-range-in-javascript (当然,如果你无论如何都是以函数式编程,并且无论如何都会使用函数调用命中每个元素,这一切都不重要.)

  • 真聪明!如果我在哪里OP我会选择这个答案. (2认同)
  • 哦,太棒了!非常巧妙地使用递归和 `concat()` https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat (2认同)

Cap*_*apK 23

它可以通过ES6的功能完成,目前只有Firefox支持.我在这里找到了一个兼容性表:http://kangax.github.io/compat-table/es6/

Array.from(new Array(20), (x,i) => i+1)
Run Code Online (Sandbox Code Playgroud)

如果你想要一些其他的范围,那么我想你可以做到

Array.from(new Array(5), (x,i) => i+5)
Run Code Online (Sandbox Code Playgroud)

那将是[5,6,7,8,9]

  • 从 v45 开始,这在 Chrome 中有效,如果您使用 Babel 转译 ES6,则可以使用。你也可以做`Array.from({ length: 20 }, (v, k) =&gt; k + 1);` (2认同)

End*_*ssa 16

你可以使用while循环来执行此操作,其中push发生在condition.Array.push中,返回数组的长度,恰好与此情况下的值相同.因此,您可以执行以下操作:

x = []; //normally would use var here
i = 1;  //normally would use var here
while(x.push(i++)<20){}

//at this point, x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
Run Code Online (Sandbox Code Playgroud)

简明版(31个字符)

x=[];i=1;while(x.push(i++)<20);
Run Code Online (Sandbox Code Playgroud)

jsFiddle例子

  • 他通过不使用var来节省空间,但是如果你实现了这个,请使用var,或者维护代码的人会找到你...... (3认同)

Kil*_*roy 7

If you're OK with 0-20, here are my latest favs from recent code golfing:

[...'0'.repeat(21)].map((_,i)=>i)
Array.from({length:21},(_,i)=>i)
Array(21).fill().map((_,i)=>i)
[...Array(21)].map((_,i)=>i)
Array(21).map((_,i)=>i)
[...Array(21).keys()]
Run Code Online (Sandbox Code Playgroud)


coc*_*cco 5

而--是要走的路

var a=[],b=10;while(b--)a[b]=b+1
Run Code Online (Sandbox Code Playgroud)

返回 [1,2,3,4,5,6,7,8,9,10]

用开始和长度解释

var array=[],length=20,start=5;while(length--)array[length]=length+start
Run Code Online (Sandbox Code Playgroud)

返回 [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

想要范围?

用开始和结束解释

var array=[],end=30,start=25,a=end-start+1;while(a--)array[a]=end--
Run Code Online (Sandbox Code Playgroud)

返回 [25, 26, 27, 28, 29, 30]

为了 -

for(var a=[],b=20;b>0;b--,a[b]=b+1)
Run Code Online (Sandbox Code Playgroud)

对于++

for(var a=[],b=0;b<20;b++,a[b]=b+1)
Run Code Online (Sandbox Code Playgroud)

为什么要走这条路?

  1. while -- 是最快的循环;

  2. 直接设置比 push & concat 更快;

  3. [] 也比 new Array(10) 快;

  4. 它的代码并不比所有其他代码长

字节保存技术:

  1. 使用参数作为函数变量的占位符
  2. 如果不需要,不要使用 new Array(),push(),concat()
  3. 仅在需要时放置 "(){};,"。
  4. 在短函数中使用 a,b,c,d...。

所以如果你想要一个功能

开始,结束(范围)

function range(a,b,c,d){d=[];c=b-a+1;while(c--)d[c]=b--;return d}
Run Code Online (Sandbox Code Playgroud)

所以现在 range(3,7) 返回 [3,4,5,6,7]

你在这里以多种方式保存字节,这个函数也非常快,因为它不使用 concat、push、new Array 并且它是用一段时间制作的——