在 Javascript/jQuery 中创建两个数字之间的所有整数的数组(包括两个数字)
假设我有以下复选框:
<input type="checkbox" value="1-25" />
要获取定义我正在查找的范围边界的两个数字,我使用以下 jQuery:
var value = $(this).val();
var lowEnd = Number(value.split('-')[0]);
var highEnd = Number(value.split('-')[1]);
然后如何创建一个包含 lowEnd
之间所有整数的数组和 highEnd
,包括 lowEnd
和 highEnd
本身?对于这个具体示例,显然,结果数组将是:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
Say I have the following checkbox:
<input type="checkbox" value="1-25" />
To get the two numbers that define the boundaries of range I'm looking for, I use the following jQuery:
var value = $(this).val();
var lowEnd = Number(value.split('-')[0]);
var highEnd = Number(value.split('-')[1]);
How do I then create an array that contains all integers between lowEnd
and highEnd
, including lowEnd
and highEnd
themselves? For this specific example, obviously, the resulting array would be:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(25)
在测试和调整上述所有纯 js 解决方案之后,我为您提供以下解决方案,基于所提供的最快算法,并且与 python 系列兼容。
js 版本更好,因为它支持小数。
请参阅 python 代码,仅适用于整数:
After testing and adjusting all the pure js solutions above, I offer you the following solution, based on the fastest algo offered, and compatible with the python range.
The js version is even better, since it supports decimals.
see the python code, for integers only:
打字稿版本:
Typescript version:
解决下划线
Solving in underscore
希望下面的方法对某人有所帮助。
这里
count
变量可以用来表示数组长度。Hope the below method will help someone.
Here
count
variable can be used to mention the array length.处理此问题的一种优雅且通用的方法是创建一个生成器:
然后您可以在其上使用扩展运算符:
function*
语法表示一个生成器,它可以暂停执行并从停止的位置恢复。它允许它随着时间的推移生成一系列值,而不是一次计算所有值并返回它们。An elegant and versatile way to handle this is to create a generator:
Then you can use the spread operator on it:
The
function*
syntax denotes a generator which can pause execution and resume from where it left off. It allows it to produce a sequence of values over time instead of computing them all at once and returning them.你可以在 ES6 中一行完成
You can do that in one line in ES6
来源:https://developer.mozilla。 org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
source: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
这里有 3 个函数应该涵盖我能想到的所有内容(包括修复其他一些答案中的问题):
rangeInt()
、range()
和Between( )
。在所有情况下都考虑升序和降序。示例
rangeInt()
包括端点并仅处理整数
range()
与
rangeInt()
相同,但Between()
与
range() 相同,但
源
Here's 3 functions that should cover everything I could think of (including fixes for problems in some other answers):
rangeInt()
,range()
, andbetween()
. Both ascending and descending orders are accounted for in all cases.Examples
rangeInt()
Includes endpoints and only deals with integers
range()
Same as
rangeInt()
exceptbetween()
Same as
range()
exceptSource
将 http://minifiedjs.com/ 添加到答案列表中:)
代码类似于下划线和其他:
此处的文档:
http://minifiedjs.com/api/range.html
我使用 minified.js 因为它解决了我的所有问题都涉及占用空间小且语法易于理解。对我来说,它是一个框架中 jQuery、MustacheJS 和 Underscore/SugarJS 的替代品。
当然,它不像下划线那么流行。这可能是一些人担心的问题。
Minified 由 Tim Jansen 使用 CC-0(公共领域)许可证提供。
Adding http://minifiedjs.com/ to the list of answers :)
Code is similar to underscore and others:
Docs here:
http://minifiedjs.com/api/range.html
I use minified.js because it solves all my problems with low footprint and easy to understand syntax. For me, it is a replacement for jQuery, MustacheJS and Underscore/SugarJS in one framework.
Of course, it is not that popular as underscore. This might be a concern for some.
Minified was made available by Tim Jansen using the CC-0 (public domain) license.
您可以设计一种范围方法,将“起始”数字增加所需的量,直到达到“结束”数字。
此示例将向上或向下“计数”,具体取决于 from 大于还是小于 to。
如果你想以小数为单位步进:Array.range(0,1,.01)
您将需要截断任何浮点不精确的值。
否则你会返回像这样的数字
0.060000000000000005 而不是 0.06。
这给其他版本增加了一点开销,但对于整数或小数步可以正常工作。
You can design a range method that increments a 'from' number by a desired amount until it reaches a 'to' number.
This example will 'count' up or down, depending on whether from is larger or smaller than to.
If you ever want to step by a decimal amount : Array.range(0,1,.01)
you will need to truncate the values of any floating point imprecision.
Otherwise you will return numbers like
0.060000000000000005 instead of .06.
This adds a little overhead to the other version, but works correctly for integer or decimal steps.
可能有一种更干燥的方法来完成循环,但这是基本思想。
There's probably a DRYer way to do the loop, but that's the basic idea.
如果开始总是小于结束,我们可以这样做:
如果我们希望能够采用第三个参数来修改用于构建数组的步骤,并使其工作,即使开始大于end:
这样函数接受正步和负步,如果没有给出步,则默认为 1。
If the start is always less than the end, we can do:
If we want to be able to take a third argument to be able to modify the step used to build the array, and to make it work even though the start is greater than the end:
This way the function accepts positive and negative steps and if no step is given, it defaults to 1.
我的五美分:
双向整数数组函数。
当range(0, 5)变为
[0, 1, 2, 3, 4, 5]
时。并且 range(5, 0) 变为
[5, 4, 3, 2, 1, 0]
。基于这个答案。
PS 为了在现实生活中使用,您还应该检查
isFinite()
和isNaN()
的参数。My five cents:
Both direction array of integers function.
When range(0, 5) become
[0, 1, 2, 3, 4, 5]
.And range(5, 0) become
[5, 4, 3, 2, 1, 0]
.Based on this answer.
P.S. For use in real life you should also check args for
isFinite()
andisNaN()
.纯 ES6 的解决方案
受到上面 m59 答案的启发,但不依赖于
fill
:所以你可以像这样使用它:
Solution with pure ES6
Inspired by m59's answer above, but without the dependency on
fill
:So you can use it like:
这大致相当于
将其分解:
这会创建一个具有正确标称长度的稀疏矩阵。现在稀疏矩阵的问题是,虽然它具有正确的标称长度,但它没有实际元素,因此, for
给我们
然后
将稀疏矩阵作为参数列表传递给 Array 构造函数,该构造函数生成一个稠密矩阵(实际) length targetLength,其中所有元素都有未定义的值。第一个参数是数组构造函数执行上下文的“this”值,在这里不起作用,因此为 null。
所以现在,
yields
最终
利用了 Array.map 函数将: 1. 当前元素的值和 2. 当前元素的索引传递给映射委托/回调的事实。第一个参数将被丢弃,而在调整起始偏移量后,第二个参数可用于设置正确的序列值。
那么
产量
this is roughly equivalent to
breaking it down:
this creates a sparse matrix of the correct nominal length. Now the problem with a sparse matrix is that although it has the correct nominal length, it has no actual elements, so, for
gives us
Then
passes the sparse matrix as an argument list to the Array constructor, which produces a dense matrix of (actual) length targetLength, where all elements have undefined value. The first argument is the 'this' value for the the array constructor function execution context, and plays no role here, and so is null.
So now,
yields
finally
makes use of the fact that the Array.map function passes: 1. the value of the current element and 2. the index of the current element, to the map delegate/callback. The first argument is discarded, while the second can then be used to set the correct sequence value, after adjusting for the start offset.
So then
yields
最快的方式
功能更快:
或
编辑
可读版本
演示
http://jsfiddle.net/W3CUn/
对于反对者
性能
http://jsperf.com/for-push-while-set/2
在 ie 和 中更快在 Firefox 中速度提高 3 倍
仅在 aipad air 上 for 循环速度稍快一些。
在 win8、osx10.8、ubuntu14.04、ipad、ipad air、ipod 上测试;
与 chrome,ff,ie,safari,移动 safari。
我想看看旧版 ie 浏览器的性能,其中 for 循环没有那么优化!
fastest way
function:
or
EDIT
readable version
Demo
http://jsfiddle.net/W3CUn/
FOR THE DOWNVOTERS
performance
http://jsperf.com/for-push-while-set/2
faster in ie and 3x faster in firefox
only on aipad air the for loop is a little faster.
tested on win8, osx10.8, ubuntu14.04, ipad, ipad air, ipod;
with chrome,ff,ie,safari,mobile safari.
i would like to see the performance on older ie browsers where the for loop isn't that optimized!
我的循环版本;)
My version of the loop ;)
在 JavaScript ES6 中:
为了完整起见,这里有一个可选的
step
参数。我会使用
range-inclusive
来自 npm 在实际项目中。它甚至支持后退,这很酷。In JavaScript ES6:
For completeness, here it is with an optional
step
parameter.I would use
range-inclusive
from npm in an actual project. It even supports backwards steps, so that's cool.我强烈推荐下划线或低破折号库:
http://underscorejs.org/#range
(几乎完全兼容,显然 lodash 运行得更快,但下划线有更好的 doco 恕我直言)
这两个库都有一堆非常有用的实用程序。
I highly recommend underscore or lo-dash libraries:
http://underscorejs.org/#range
(Almost completely compatible, apparently lodash runs quicker but underscore has better doco IMHO)
Both libraries have bunch of very useful utilities.
ES6:
使用 Array.from (文档此处):
ES6 :
Use Array.from (docs here):