[javascript] Python range ()와 유사한 JavaScript 함수

JavaScript에 Python과 유사한 함수가 range()있습니까?

매번 다음 줄을 쓰는 것보다 더 좋은 방법이 있어야한다고 생각합니다.

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



답변

아니요 , 아무것도 없지만 만들 수 있습니다 .

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 을 참조하십시오 .

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)반환 [],

그리고 파이썬 대응 은 정확히 같은 방식으로 작동합니다 (적어도 언급 된 경우) :

>>> 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()위에서 언급 한 솔루션을 사용할 수 있습니다.


답변

ES6의 매우 간단한 범위 :

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

에서 bigOmega의 코멘트 , 이것은 사용 단축 할 수 확산 구문 :

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


답변

2018 :이 답변은 계속 찬성 투표를 받고 있으므로 여기에 업데이트가 있습니다. 아래 코드는 더 이상 사용되지 않지만 운 좋게도 ES6는 생성기와 yield키워드를 표준화 했으며 모든 플랫폼에서 보편적으로 지원됩니다. lazy range()using 의 예는 여기yield 에서 찾을 수 있습니다 .


말했다 이미 무슨뿐만 아니라, 자바 스크립트 1.7+에 대한 지원 제공 반복자 및 발전기 의 게으른, 메모리 효율적인 버전 만드는 데 사용할 수 있습니다 range에 simlar을 xrangePython2의를 :

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


답변

rangePython 2 의 함수 포트는 underscore.jslodash 유틸리티 라이브러리 (다른 많은 유용한 도구와 함께)에서 제공됩니다. 밑줄 문서에서 복사 한 예 :

_.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);
=> []


답변

Number프로토 타입에 반복자를 연결하여 달성 할 수 있습니다.

  Number.prototype[Symbol.iterator] = function* () {
     for (var i = 0; i <= this; i++) {
       yield i
     }
  }

[...5] // will result in [0,1,2,3,4,5]

Kyle Simpson의 비동기 JavaScript 재검토 과정에서 발췌


답변

범위의 시작 위치와 끝 위치를 모두 지정해야하는 경우 답변 중 하나에 대한 작은 확장이 있습니다.

let range = (start, end) => Array.from(Array(end + 1).keys()).slice(start);