一尘不染

在JavaScript中从1..20创建整数数组的最有趣的方法

algorithm

创建此数组的最明智的方法是:

var x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
         11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

例如,for循环:

var x = [];
for (var i=1;i<=20;i++) {
  x.push(i);
}

while循环:

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

还会有其他示例更短些吗?换句话说,就是更少的代码?我正在考虑像Ruby这样的事情,我认为等效的代码将和一样简单1..20。我不了解JavaScript中的语法,但是我想知道是否有较短的方法可以完成相同的操作。

更新:
我不是想删除分号或var问题中的答案,但我必须承认这个问题暗示着这一点。我对算法比对减少字节数更好奇。对不起,如果我不清楚!而且,将其变成一个函数非常简单,只需将function range(start, end) { /* guts here */ }它拍一下就可以了。问题是对“胆量”是否有新颖的方法。


阅读 183

收藏
2020-07-28

共1个答案

一尘不染

经过一番思考,这是range(N)我可以想到的JavaScript中标准函数的最短实现:

function range1(i){return i?range1(i-1).concat(i):[]}

注意 :请勿在生产中使用;是O(N ^ 2)

与当前最受好评的答案相反:

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

例:

> range1(5)
[1, 2, 3, 4, 5]

这就像要递归的发贴子一样,尽管我原本希望在我想到三元陈述之前,它会更长一些,从而将其减少到42个必需的字符。

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


更新:哦,我发现了一个令人难以置信的简短版本,它通过滥用for循环,反向排序,赋值返回一个值的事实:丑陋的命令语法:for(y=[],i=20;y[--i]=i;){}仅包含25个字符(尽管您希望将var y其插入到for循环中,如果不想0 …
19,则+1)。虽然不需要定义一个函数,它并不短,但是比i?r(i-1).concat(i):[]不需要创建一个函数,它要短。


最喜欢的方法

2015年9月13日更新:

刚刚想出了这种新方法,该方法可用于支持ES6标准的浏览器:

> Array(5).fill().map((x,i)=>i)
[0, 1, 2, 3, 4]

还有这个:

> Array.from(Array(5),(x,i)=>i)
[0, 1, 2, 3, 4]

添加了一些性能分析测试用例:看来,除了标准的有序for循环以外,其他所有东西的速度至少要慢10倍,至少在V8上是如此。https://jsperf.com/array-
range-in-javascript
(当然,如果您始终以函数样式进行编程,并且无论如何都会通过函数调用击中每个元素,那么这无关紧要。)

2020-07-28