在 JavaScript 中创建 1..20 整数数组的最简洁方法

2024-04-19

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

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

例如,一个for loop:

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

Or a while loop:

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

是否还有其他更简洁的示例——换句话说——更少的代码?我正在考虑像 Ruby 这样的事情,我相信等效的代码会像这样简单1..20。我不知道 JavaScript 中的语法,但我想知道是否有更短的方法来完成同样的事情。

UPDATE:我没有考虑删除分号或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=[]是线性复杂度,但依赖于符号的滥用,并且不可读并且还会污染全局变量。但是,由于定义了箭头函数(它不绑定而是继承this)现在非常简洁,您可以将上面的解决方案包装起来:

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

根据情况,最简洁的方法是range(N),如果您已经有一个长度恰好为 N 的列表,则只需map它:例如而不是做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):[]}

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

与当前得票最高的答案对比:

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

Example:

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

这就像递归的典型例子,尽管我原以为它会更长,直到我想到三元 if 语句,这将其减少到 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):[]如果你不需要做一个功能。


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JavaScript 中创建 1..20 整数数组的最简洁方法 的相关文章

随机推荐

  • iTerm2 隐藏标记

    我最近安装了 iTerm2 的 Shell Integration 但在输入 shell 命令时它还添加了那些小箭头 称为标记 这真的很烦人 有什么方法可以禁用 隐藏它们 我在网上找不到 As per 文档 https www iterm2
  • 让 IIS6 与 WordPress 完美配合

    我有一个由 WordPress 驱动的博客 我正在尝试在 IIS6 服务器上进行设置 除了令我头疼的永久链接结构之外 一切正常 在谷歌搜索 wordpress codex之后 我了解到这是因为IIS6没有相当于Apache的mod rewr
  • 如何在 Android 上注册的应用程序中从我的 WebView 中启动 Web 链接?

    在我的 Android 应用程序中 我有一个 WebView 我想every在我的 WebView 中单击链接以启动我的设备上已注册的应用程序 如果有 否则在外部浏览器中打开 例如 如果用户从 WebView 中单击 Facebook 页面
  • Ninject - 找不到资源

    我收到错误 无法找到该资源 当我尝试在我的 MVC 3 应用程序中实现 Ninject 时 该问题似乎来自 Global asax 期间CreateKernel region Inversion of Control protected o
  • Postgres - python 多个 SSL 连接

    我在使用 psycopg2 和 SSL 建立两个并发 Postgres 数据库连接 一个到主数据库 一个到从数据库 时遇到问题 两个连接分别工作 即 import psycopg2 dsnMaster dbname sslcert path
  • 在嵌入式设备上使用new或malloc引起的段错误[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • 多个 Access-Control-Allow-Origin 标头

    作为参考 我使用的是 Visual Studio 2017 和 Windows 10 我有一个 Web api 和带有用户帐户的相应 Web 应用程序 当我尝试登录时遇到一个错误 指出不存在 Access Control Allow Ori
  • 如何使用 JavaScript 将 HTML 转换为 XHTML?

    我需要在字符串中所有图像标签的末尾添加斜杠 我正在使用 JavaScript 正则表达式 这是我到目前为止所拥有的 strInput strInput replace
  • 计算编辑距离的最有效方法

    我刚刚实现了最佳匹配文件搜索算法来查找与字典中的字符串最接近的匹配项 对我的代码进行分析后 我发现绝大多数时间都花在计算查询与可能结果之间的距离上 我目前正在实现使用二维数组计算编辑距离的算法 这使得实现成为 O n 2 操作 我希望有人能
  • 在 Gulp 中将流与事件流连接时的顺序

    在此 Gulp 任务中 vendorFiles 代码放置在 dest style css 文件中的 appFiles 代码之后 这是因为 appFiles 流运行得更快吗 如何让vendorFiles代码按预期出现在前面 gulp task
  • 从线程内更新网页

    我有一个运行冗长过程的网页 除了在页面上显示进度之外 所有这些都在工作 我有以下进度条 引导程序 div class col md 8 div
  • 如何在 WPF 中使用 MVVM 从另一个视图打开一个视图

    我是 MVVM 新手 很长一段时间以来我都无法得到这个问题的答案 不知道是问题太难还是我没有解释清楚 我有 MainWindow Xaml 其中包含一个文本块和一个用于从文本块接收数据的按钮 现在当我按下按钮时 它应该打开第二个名为 tab
  • JavaFx 如何避免创建一个巨大的控制器

    我在 JavaFX 中有一个应用程序 它有带有菜单和工具栏的主场景 以及在按下菜单按钮之一后注入到该主场景中的较小场景 现在 HomeCntroller 负责场景组件 主场景 带有工具栏和菜单 和注入场景 如果注入的场景数量超过一个 这会导
  • kotlin 中的 init 块和构造函数有什么区别?

    我已经开始学习 Kotlin 了 我想知道之间的区别init块和constructor 这之间有什么区别以及我们如何利用它来改进 class Person constructor var name String var age Int va
  • 搭建控制器时引发的调用目标已引发异常

    我创建了一个单独的类库项目来存储数据库上下文和模型类 在同一解决方案中 我创建了一个 ASP NET MVC 项目并引用了类库项目 并在项目的 Web config 文件中包含了数据库上下文的连接字符串 但是 当我尝试添加控制器 带有视图
  • NIntegrate - 为什么在这种情况下 Mathematica 8 的速度要慢得多?

    我有一个 Mathematica 代码 我必须在数值上评估数千个与此类似的积分 NIntegrate Pi Cos Pi 2 x y 1 y 1 y Sin 2 Pi x 1 y Sin Pi 2 x y 1 y E x 1 y x 0 1
  • 如何在“系统偏好设置 > 键盘 > 修饰键...”中更改修饰键

    我需要以编程方式更改 系统偏好设置 gt 键盘 gt 修饰键 中的 Caps Lock Control Option 和 Command 键的值 我不想使用 AppleScript 有人能指出我正确的方向吗 这是 applescript c
  • 为什么使用 --follow 和 --reverse 的 git log 仅返回最后一次提交?

    我想从头开始反向查看文件的所有提交 我跑了 git log reverse file 它按预期工作 但对于重命名的文件 它仅显示重命名的提交 因此我在其中添加了 follow git log reverse follow file 但它现在
  • AntiForgeryToken 在 ASP.Net MVC 4 RC 中已弃用

    我刚刚安装了 ASP Net MVC 4 RC 来替换 ASP Net MVC 4 beta 当尝试运行现有应用程序时 我收到一条错误消息 AntiForgeryToken已被弃用 这是我的代码 using Html BeginForm F
  • 在 JavaScript 中创建 1..20 整数数组的最简洁方法

    创建此数组的最简洁方法是什么 var x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 例如 一个for loop var x for var i 1 i lt 20 i x push