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())
2018 :이 답변은 계속 찬성 투표를 받고 있으므로 여기에 업데이트가 있습니다. 아래 코드는 더 이상 사용되지 않지만 운 좋게도 ES6는 생성기와 yield
키워드를 표준화 했으며 모든 플랫폼에서 보편적으로 지원됩니다. lazy range()
using 의 예는 여기yield
에서 찾을 수 있습니다 .
말했다 이미 무슨뿐만 아니라, 자바 스크립트 1.7+에 대한 지원 제공 반복자 및 발전기 의 게으른, 메모리 효율적인 버전 만드는 데 사용할 수 있습니다 range
에 simlar을 xrange
Python2의를 :
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
Python의 range
함수 포트는 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);
=> []
@Tadeck 및 @georg의 두 답변을 결합 하여 다음과 같은 결과를 얻었습니다.
function* range(start, stop, step = 1) {
if (typeof stop === 'undefined') {
// 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(0, 10, 2)) {
console.log(i);
}
// Outputs => 0 2 4 6 8
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 재검토 과정에서 발췌
여기 있습니다.
그러면 인덱스 번호로 각 인덱스의 값을 쓰거나 덮어 씁니다.
Array.prototype.writeIndices = function( n ) {
for( var i = 0; i < (n || this.length); ++i ) this[i] = i;
return this;
};
숫자를 제공하지 않으면 배열의 현재 길이를 사용합니다.
다음과 같이 사용하십시오.
var array = [].writeIndices(10); // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
범위의 시작 위치와 끝 위치를 모두 지정해야하는 경우 답변 중 하나에 대한 작은 확장이 있습니다.
let range = (start, end) => Array.from(Array(end + 1).keys()).slice(start);
다음은 Python의 range () 함수를 JavaScript에 자연스럽게 적용한 것입니다 .
// Generate range from start (inclusive) to stop (exclusive):
function* range(start, stop, step = 1) {
if (stop === undefined) [start, stop] = [0, start];
if (step > 0) while (start < stop) yield start, start += step;
else if (step < 0) while (start > stop) yield start, start += step;
else throw new RangeError('range() step argument invalid');
}
// Examples:
console.log([...range(3)]); // [0, 1, 2]
console.log([...range(0, 3)]); // [0, 1, 2]
console.log([...range(0, 3, -1)]);// []
console.log([...range(0, 0)]); // []
console.log([...range(-3)]); // []
console.log([...range(-3, 0)]); // [-3, -2, -1]
그것은에 비교 될 수있는 인수 지원 0
과 stop
에 의해 증가 될 수 있습니다 step
. 를 초과하지 않는 숫자와 함께 사용할 때 Python 버전과 동일하게 작동합니다 Number.MAX_SAFE_INTEGER
.
다음 코너 케이스에 유의하십시오.
[...range(0, 0, 0)]; // RangeError: range() step argument invalid
[...range(Number.MAX_SAFE_INTEGER + 1, Number.MAX_SAFE_INTEGER + 2)]; // []
[...range(Number.MAX_SAFE_INTEGER + 2, Number.MAX_SAFE_INTEGER + 3)]; // Infinite loop
[...range(0.7, 0.8, 0.1)]; // [0.7, 0.7999999999999999]
[...range('1', '11')]; // ['1']
[...range('2', '22')]; // Infinite loop
대조적 @ Tadeck의 , Volv의 @ 및 @ janka102의 대답하는 창 []
, undefined
혹은 때 무한 루프를 입력 step
들을 평가가 0
또는 NaN
이 함수 발생기 파이썬의 동작과 유사 예외를 던진다.
size 배열을 얻으려면 x
라이브러리를 사용하지 않는 한 줄짜리가 있습니다.
var range = n => Array(n + 1).join(1).split('').map((x, i) => i)
로 작동
> range(4)
[0, 1, 2, 3]
ES6 기본 매개 변수로 더욱 개선되었습니다.
let range = function*(start = 0, stop, step = 1) {
let cur = (stop === undefined) ? 0 : start;
let max = (stop === undefined) ? start : stop;
for (let i = cur; step < 0 ? i > max : i < max; i += step)
yield i
}
밑줄 라이브러리를 사용할 수 있습니다 . 여기에는 배열 작업에 유용한 수십 가지 기능이 포함되어 있습니다.
pythonic
range
JS 생성기 ( yield
)를 사용하여 Python 동작을 가장 잘 모방하여 range(stop)
및 range(start, stop, step)
사용 사례를 모두 지원합니다 . 또한 pythonic
의 range
함수는 및를 Generator
지원 하는 사용자 지정 빌드 객체를 반환 하므로 다음 map
과 filter
같은 멋진 한 줄짜리 작업을 수행 할 수 있습니다.
import {range} from 'pythonic';
// ...
const results = range(5).map(wouldBeInvokedFiveTimes);
// `results` is now an array containing elements from
// 5 calls to wouldBeInvokedFiveTimes
다음을 사용하여 설치 npm
:
npm install --save pythonic
pythonic
범위 에 대한 코드는 다음과 같습니다 .
function range(...args) {
if (args.length < 2) {
return new Generator(rangeGeneratorWithStop(...args));
}
return new Generator(rangeGeneratorWithSartAndStopAndStep(...args));
}
const rangeGeneratorWithStop = stop => function * () {
for (let i = 0; i < stop; i++) {
yield i;
}
};
const rangeGeneratorWithSartAndStopAndStep = (start, stop, step = 1) => function * () {
for (let i = start; i < stop; i += step) {
yield i;
}
};
function range(...args) {
if (args.length < 2) {
return new Generator(rangeGeneratorWithStop(...args));
}
return new Generator(rangeGeneratorWithSartAndStopAndStep(...args));
}
class Generator {
constructor(generatorFn) {
this[Symbol.iterator] = generatorFn;
}
map(callbackFn) {
const result = [];
for (const element of this) {
result.push(callbackFn(element));
}
return result;
}
filter(callbackFn) {
const result = [];
for (const element of this) {
if (callbackFn(element)) {
result.push(element);
}
}
return result;
}
toArray() {
return Array.from(this);
}
}
공개 저는 Pythonic의 작성자이자 관리자입니다.
Still no built-in function that is equivalent to range()
, but with the most recent version - ES2015 - you can build your own implementation. Here's a limited version of it. Limited because it doesn't take into account the step parameter. Just min, max.
const range = (min = null, max = null) => Array.from({length:max ? max - min : min}, (v,k) => max ? k + min : k)
This is accomplished by the Array.from
method able to build an array from any object that has a length
property. So passing in a simple object with just the length
property will create an ArrayIterator that will yield length
number of objects.
Here is another es6
implementation of the range
// range :: (from, to, step?) -> [Number]
const range = (from, to, step = 1) => {
//swap values if necesery
[from, to] = from > to ? [to, from] : [from, to]
//create range array
return [...Array(Math.round((to - from) / step))]
.map((_, index) => {
const negative = from < 0 ? Math.abs(from) : 0
return index < negative ?
from + index * step :
(index - negative + 1) * step
})
}
range(-20, 0, 5)
.forEach(val => console.log(val))
for(const val of range(5, 1)){
console.log(`value ${val}`)
}
MDN recommends this approach: Sequence generator (range)
No, there is none, but you can make one.
I'm partial to Python3 behavior of range. You will find below JavaScript's implementation of Python's range():
function* range(start=0, end=undefined, step=1) {
if(arguments.length === 1) {end = start, start = 0}
[...arguments].forEach(arg => {
if( typeof arg !== 'number') {throw new TypeError("Invalid argument")}
})
if(arguments.length === 0) {throw new TypeError("More arguments neede")}
if(start >= end) return
yield start
yield* range(start + step, end, step)
}
// Use Cases
console.log([...range(5)])
console.log([...range(2, 5)])
console.log([...range(2, 5, 2)])
console.log([...range(2,3)])
// You can, of course, iterate through the range instance.
참고URL : https://stackoverflow.com/questions/8273047/javascript-function-similar-to-python-range
'developer tip' 카테고리의 다른 글
유효한 연도를 테스트하기위한 정규식 일치 (0) | 2020.10.20 |
---|---|
Angular2 * ngIf는 템플릿에서 객체 배열 길이를 확인합니다. (0) | 2020.10.20 |
MongoDB : 동일한 문서의 데이터를 사용하여 문서 업데이트 (0) | 2020.10.20 |
아이콘과 텍스트가있는 Android 버튼 (0) | 2020.10.20 |
iOS-UIImageView-UIImage 이미지 방향 처리 방법 (0) | 2020.10.20 |