类似于Python range()的JavaScript函数

158 投票
33 回答
116182 浏览
提问于 2025-04-17 07:04

在JavaScript中,有没有类似于Python的range()函数的东西呢?

我觉得每次都写下面这些代码总不是个办法:

array = new Array();
for (i = 0; i < specified_len; i++) {
    array[i] = i;
}

33 个回答

44

@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
212

在ES6中,创建一个非常简单的范围:

let range = n => Array.from(Array(n).keys())

根据 bigOmega的评论,我们可以使用 展开语法 来简化这个过程:

let range = n => [...Array(n).keys()]
126

,没有现成的,但你可以自己做一个

JavaScript 实现 Python 的 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来验证。

JavaScript 和 Python 中 range() 的比较

它的工作方式如下:

  • 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() 一样工作,你可以使用上面提到的解决方案。

撰写回答