JavaScript function similar to Python range()
Fusing together both answers from @Tadeck and @georg, I came up with this:
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;
}
}
To use it in a for loop you need the ES6/JS1.7 for-of loop:
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
No, there is none, but you can make one.
JavaScript's implementation of Python's range()
Trying to emulate how it works in Python, I would create function similar to this:
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;
};
See this jsfiddle for a proof.
Comparison between range()
in JavaScript and Python
It works in the following way:
range(4)
returns[0, 1, 2, 3]
,range(3,6)
returns[3, 4, 5]
,range(0,10,2)
returns[0, 2, 4, 6, 8]
,range(10,0,-1)
returns[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
,range(8,2,-2)
returns[8, 6, 4]
,range(8,2)
returns[]
,range(8,2,2)
returns[]
,range(1,5,-1)
returns[]
,range(1,5,-2)
returns[]
,
and its Python counterpart works exactly the same way (at least in the mentioned cases):
>>> 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)
[]
So if you need a function to work similarly to Python's range()
, you can use above mentioned solution.
For a very simple range in ES6:
let range = n => Array.from(Array(n).keys())
From bigOmega's comment, this can be shortened using Spread syntax:
let range = n => [...Array(n).keys()]