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 (当然,如果你无论如何都是以函数式编程,并且无论如何都会使用函数调用命中每个元素,这一切都不重要.)
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]
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)
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)
而--是要走的路
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)
为什么要走这条路?
while -- 是最快的循环;
直接设置比 push & concat 更快;
[] 也比 new Array(10) 快;
它的代码并不比所有其他代码长
字节保存技术:
所以如果你想要一个功能
开始,结束(范围)
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 并且它是用一段时间制作的——