gpt4 book ai didi

javascript - 在 JavaScript 中从 1..20 创建整数数组的最简单方法

转载 作者:IT王子 更新时间:2023-10-29 03:05:49 30 4
gpt4 key购买 nike

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

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 */} 就可以了。问题是是否有新的方法来处理“胆量”。

最佳答案

最喜欢的方法

2015 年 9 月 13 日更新:

刚刚想出了这个适用于支持 ES6 标准的浏览器的新方法:

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

请注意,上面的代码做了一点点额外的工作(用 undefined 填充),但是相对于使用 for 循环可以实现的加速而言,这是相对较小的,如果您忘记了.fill 您可能对为什么您的数组神秘地是 [empty x 5] 感到困惑。您可以将上述内容封装为自定义函数,或者使用更符合预期的方法:

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

你当然可以直接从那里进入你想做的任何事情,比如 python 的列表理解,例如[i**2 for i in range(5)]:

> Array.from(Array(5), (_,i)=> i**2)
[0, 1, 4, 9, 16]

...或者如果你想变得更复杂...:

> Array.from(Array(5), (_,i)=> {
const R = /*some computation*/;
return /*etc*/;
});

[编辑,2021 年 5 月]:如今定义此类函数的理论上最简洁的方法是 f=i=>i?[...f(i-1),i]:[] ,其中您将 f 替换为 range1 或任何名称,但由于中间结构,它会非常慢(二次复杂度),因此永远不应使用。 f=i=>i?f(i-1)&&x.push(i)&&x:x=[] 是线性复杂度但依赖于符号的滥用并且不可读并且污染全局变量.但是,由于现在定义箭头函数(不绑定(bind)而是继承 this)非常简洁,您可以将上面的解决方案包装起来:

const range1 = n=> Array.from(Array(n), (_,i)=> i+i);
// range1(5)==[1, 2, 3, 4, 5]

如果您已经有一个长度恰好为 N 的列表,那么执行 range(N) 的最简洁的方法就是映射它:例如而不是做 Array.from(Array(myArr.length), (_,i)=> i**2),你只需要做 myArr.map((_,i) => i**2)。 (除非您愿意,否则这没有副作用。)


以下所有内容都是历史性的:

稍微考虑一下后,这是我能想到的标准 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]

这就像递归的典型代表,尽管我原以为它会更长,直到我想到三元 if 语句,这将它减少到 42 个必要的字符。

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


更新:哦,我通过滥用 for 循环、反向排序、赋值返回值的事实发现了一个非常短的版本,它具有丑陋的命令式语法:for(y=[],i=20;y[ --i]=i;){} 仅由 25 个字符组成(尽管您需要 var y,您可以将其插入到 for 循环中,如果不需要则 +1想要 0...19)。如果你需要定义一个函数,它并不短,但如果你不需要创建一个函数,它比 i?r(i-1).concat(i):[] 更短。


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

关于javascript - 在 JavaScript 中从 1..20 创建整数数组的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6299500/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com