2017-11-11 12 views
0

목록이나 생성기를 입력으로 사용할 수있는 함수를 작성하려고합니다. 예를 들어,이 기능 :for 루프에서 for ES6 javascript를 어떻게 재사용합니까?

function x(l) { 
    for (let i of l) { 
     console.log(i); 
    } 
    for (let i of l) { 
     console.log(i); 
    } 
} 

나는이처럼 실행하는 경우 :

x([1,2,3]) 

그것은 표시됩니다

1 
2 
3 
1 
2 
3 

지금 내가 입력으로 발전기를 사용하려면 :

function *y() { 
    yield 5 
    yield 6 
    yield 7 
} 

다음은 작동하지 않습니다.

x(y()) 
x(y) 

출력은 다음과 같습니다

5 
6 
7 
undefined 

내가 그것을 작동하게 할 수있는 내가 그렇게해야합니까?

자바의 측면에서, 상기 기능 y이고 생성기y()반복자이다. [1,2,3]은 목록이고 Java에서는 목록이 생성자입니다. 그러나 javascript for 루프는 반복자을 다시 시작해야한다는 것을 의미합니다. 이것은 for 루프가 생성자가 아닌 반복자에서 작동한다는 자바 스크립트의 결함처럼 보입니다.

답변

2

생성기 cannot be used multiple times. 두 번 반복하려면 generator 함수를 두 번 호출하여 두 개의 생성자를 만들어야합니다.

함수가 반복 가능한 (즉이 for … of 루프에 사용) 발전기 기능에서 즉석에서 하나를 만드는 것입니다 예상 할 때 당신이 할 수있는 일 : 당신이 당신의 함수를 작성하려면

x({[Symbol.iterator]: y}) 

x iterator 또는 generator 함수를 사용할 수 있도록 다음과 같이 사용할 수 있습니다.

getIterator(val) { 
    if (typeof val == "function") // see also https://stackoverflow.com/q/16754956/1048572 
     return val(); 
    if (typeof val[Symbol.iterator] == "function") 
     return val[Symbol.iterator](); 
    throw new TypeError("not iterable!") 
} 
function x(l) { 
    for (let i of getIterator(l)) { 
     console.log(i); 
    } 
    for (let i of getIterator(l)) { // call getIterator again 
     console.log(i); 
    } 
} 
x(y); 
+1

좋아요! 이제 이해가된다. y는 생성자 함수이고, y()는 반복자이며, Symbol.iterator로 작성한 내용은 반복 가능한 iterable이며 재사용 할 수 있습니다. for 루프는 iterator 또는 iterable을 가질 수있다. 나는 당신의 단 하나의 라이너가 나를 위해 일할 수 있도록 반복 가능한 기능을 원했습니다. 감사! – Eyal