JavaScript 中是否有类似于 Python 的函数range()
?
我认为应该有比每次都写以下几行更好的方法:
array = new Array();
for (i = 0; i < specified_len; i++) {
array[i] = i;
}
JavaScript 中是否有类似于 Python 的函数range()
?
我认为应该有比每次都写以下几行更好的方法:
array = new Array();
for (i = 0; i < specified_len; i++) {
array[i] = i;
}
对于 ES6 中的一个非常简单的范围:
let range = n => Array.from(Array(n).keys())
从bigOmega 的评论中,这可以使用Spread 语法来缩短:
let range = n => [...Array(n).keys()]
不,没有,但你可以制作一个。
range()
尝试模拟它在 Python 中的工作方式,我将创建类似于此的函数:
function range(start, stop, step) {
if (typeof stop == 'undefined') {
// one param defined
stop = start;
start = 0;
}
if (typeof step == 'undefined') {
step = 1;
}
if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
return [];
}
var result = [];
for (var i = start; step > 0 ? i < stop : i > stop; i += step) {
result.push(i);
}
return result;
};
请参阅此 jsfiddle以获取证明。
range()
JavaScript 和 Python 的比较它的工作方式如下:
range(4)
返回[0, 1, 2, 3]
,range(3,6)
返回[3, 4, 5]
,range(0,10,2)
返回[0, 2, 4, 6, 8]
,range(10,0,-1)
返回[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
,range(8,2,-2)
返回[8, 6, 4]
,range(8,2)
返回[]
,range(8,2,2)
返回[]
,range(1,5,-1)
返回[]
,range(1,5,-2)
返回[]
,和它的 Python 对应的工作方式完全相同(至少在提到的情况下):
>>> range(4)
[0, 1, 2, 3]
>>> range(3,6)
[3, 4, 5]
>>> range(0,10,2)
[0, 2, 4, 6, 8]
>>> range(10,0,-1)
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
>>> range(8,2,-2)
[8, 6, 4]
>>> range(8,2)
[]
>>> range(8,2,2)
[]
>>> range(1,5,-1)
[]
>>> range(1,5,-2)
[]
因此,如果您需要一个与 Python 类似的函数range()
,您可以使用上述解决方案。
2018 年:这个答案不断获得赞成票,所以这里有一个更新。下面的代码已经过时,但幸运的是 ES6 标准化的生成器和yield
关键字,并且它们得到了跨平台的普遍支持。可以在此处找到延迟range()
使用的示例。 yield
除了已经说过的内容之外,Javascript 1.7+ 还提供了对迭代器和生成器的支持,它们可用于创建range
类似于 Python2的惰性、内存高效版本xrange
:
function range(low, high) {
return {
__iterator__: function() {
return {
next: function() {
if (low > high)
throw StopIteration;
return low++;
}
}
}
}
}
for (var i in range(3, 5))
console.log(i); // 3,4,5
将@Tadeck和@georg 的两个答案融合在一起,我想出了这个:
function* range(start, stop, step = 1) {
if (stop == null) {
// one param defined
stop = start;
start = 0;
}
for (let i = start; step > 0 ? i < stop : i > stop; i += step) {
yield i;
}
}
要在 for 循环中使用它,您需要 ES6/JS1.7 for-of 循环:
for (let i of range(5)) {
console.log(i);
}
// Outputs => 0 1 2 3 4
for (let i of range(0, 10, 2)) {
console.log(i);
}
// Outputs => 0 2 4 6 8
for (let i of range(10, 0, -2)) {
console.log(i);
}
// Outputs => 10 8 6 4 2
range
来自 Python 2的函数端口由underscore.js和lodash实用程序库(以及许多其他有用的工具)提供。从下划线文档中复制的示例:
_.range(10);
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11);
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5);
=> [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1);
=> [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0);
=> []