JS 기호 교체기 및 생성기 - 연습
A Linked List
Repl
짧았어
목록을 반복해서 훑어보았을 때, 대부분의 사람들이 지금 그것을 직관적으로 사용할 수 있을 것이다.
Array.map()
그러나 우리 중 많은 사람들이 데이터가 아니라 응용 프로그램 논리로 정의된 숫자에 따라 목록을 만드는 것을 좋아한다.보통, 나는 가져오거나 범위 도움말을 만들 것이다.피보나치 같은 특정 서열은?이곳에서 우리는 거대하고 무한대할 수 있는 목록의 힘을 이용할 수 있다.통상적으로 lodash.range
에서 목록이 특히 크면 큰 목록은 성능에 영향을 미친다.본질적으로, 우리는 로드 지연 시퀀스를 만들고 있습니다.
오늘날의 많은 라이브러리에서, 우리는 데이터 목록을 처리하는 데 자주 사용하는 방법으로, 이러한 데이터의 길이나 모든 요소의 크기가 매우 클 수 있다.그림 갤러리.
많은 조수를 작성하거나 라이브러리를 가져오거나 번거로운 유형 관련을 템플릿 파일로 만들지 않아도 내장 생성기를 볼 수 있습니다.
현재, 우리가 응용 프로그램 시퀀스, 심지어 사용할 수 있는 json을 정의할 때, 우리는 데이터 흐름의 수도꼭지를 즉시 닫을 수 있다.필요할 때만 그것을 열어 다시 사용할 수 있도록 하고, 다시 시작할 때 완전히 버릴 수 있도록 합니다.
체인 테이블
데이터 목록을 지정하여 다음과 같이 시작할 수 있습니다.
const familyTree = [
["Adam", "Jane", "Doe"],
["Jane", "Peter", "Mary"],
["Mary", "Liam", "Olivia"],
["William", "Ava", "Lucas"]
]
여기에 우리는'정렬'목록이 하나 있는데 O(n)
부터 시작해서 최초의 세대이고 마지막 색인이 가장 오래된 것이다.첫 번째는'아이', 다른 두 번째는 친부모라고 가정해 보자.
반복자 논리
창설
familyTree[0]
교체기 논리부터 시작합시다.function* genList(p1, p2) {
const genealogy = [...familyTree].reverse();
}
우리의 데이터를 고려하여 나는 한 세대부터 역작업을 시작하고 확장 연산자를 사용하여 돌연변이를 방지하기로 했다.이 데이터들 중, 우리 가족 트리는 목록의 맨 앞이나 맨 앞에 최신 세대를 포함하고 있다.그래서 우리는 시작하기 전에 명세서를 거꾸로 할 수 있다.
굴복*
우리는
familyTree
모든 요소의 맵을 쉽게 만들어서 주어진 데이터를 간단하게 '교체' 하고 yield*
의 모든 그룹을 제시할 수 있지만, 그 즐거움은 어디에 있는가.우리의 생성기는 논리가 있어야 하고 familyTree
는 조건이 있어야 한다!yield genealogy[i]
의 작용을 밝히기 위해서*
:function* genList() {
yield* [...familyTree].reverse();
}
let i = genList();
console.log(i.next().value); // [ 'William', 'Ava', 'Lucas' ]
console.log(i.next().value); // [ 'Mary', 'Liam', 'Olivia' ]
누구yield*
나 누구를 찾고 있는지 검색해 봅시다.데이터 반전
function* genList(p1, p2) {
const genealogy = [...familyTree].reverse();
let start = 0, end = genealogy.length - 1;
for (const i in genealogy) {
if (genealogy[i].includes(p2)) {
start = +i // coerce typeof i to number from string
}
if (genealogy[i].includes(p1)) {
// Exercise: what would go here, and why?
// leave a comment below 😉
}
}
이제 우리는 여기에 없는 이름을 배제할 수 있다.모든 가족의 수조에 있는 링크를 찾아서 앞의 수조에 대한 간단한 목록을 순환합니다.
아이가 부모가 되었습니까?
매인.js
function* genList(p1, p2) {
[...]
// |-> Read along
// Iterator Logic
for (let i = start; i <= end; i++) {
// yield will send over the first family
let link = yield genealogy[i]
// with .next(Child) we can pass over a name
// from the above: yield genealogy[i]
// to the above: link
if (link && (i + 1) <= end) {
let [_, ...parents] = genealogy[i + 1]
// Did that child became a parent?
// Let's see if parents include the link
if (parents.includes(link)) {
yield genealogy[i]
}
} else {
// but if there's no subsequent links...
break;
}
}
}
적용하고 테스트하도록 하겠습니다.
매인.js
/**
*
* @param p1 Child
* @param p2 Relative
*/
const isGenerational = (p1, p2) => {
let link;
// generate genealogy with lower and upper bounds
const ancestry = genList(p1, p2)
// get Child from each family and yield links
for (const [ancestor] of ancestry) {
(ancestor === p1)
// if p1 is found, we can throw the list away
? link = ancestry.return(true)
// if linked list continues
: link = ancestry.next(ancestor)
}
return (link.done && link.value)
}
(async () => {
console.log(
(isGenerational("Adam", "Olivia") === true),
(isGenerational("Adam", "Lucas") === false),
(isGenerational("Jane", "Liam") === true),
(isGenerational("Mary", "Ava") === false),
)
})();
회신
요점을 요약하고 다시 말하다.
수익률을 통해next에서 매개 변수를 분해하다
수익률을 통해next에서 매개 변수를 분해하다
이 이상한 말 좀 보자
let link = yield genealogy[i]
를 초기화하여 유용하게 만듭니다
우리는 먼저 데이터를 보내고 상하문과 관련된 데이터를 기다릴 수 있습니다
let whatAboutThis = yield context[i]
if (whatAboutThis) {
// perform check, updates, hydrate, whatever
await updateContext(whatAboutThis)
yield context["imaginary"]
}
기본적으로 우리의 함수가 어떤 값을 얻었을 때, 우리는 교체기로 하여금 그것을 생성기에 전달하고 새로운 값을 분배할 수 있다
const iterator = contextSequence(); // generates sequence of "context"
let water = iterator.next("hydrate"); // <- gets passed to `whatAboutThis`
water.value // -> value stored of context["imaginary"]
나는 이곳의 반응 상태 처리 프로그램을 상상할 수 있다.미국 연방준비위원회(federal reserve)의 일부 데이터는 저장량이 비교적 적을 때만 접근할 수 있다고 상상해 보세요.나른한 갤러리
비동기적이지만 AOT를 실행하지 않는 대형 대기열을 처리하는 좋은 방법
구독의 비시간적 관건적인 사건에 대해 온스 제거 기능을 고려하고 있습니다.재밌게 놀아야 되는데.거의 모든 예p2
가 무한 목록에 표시되기 때문에 매우 실용적이다
Reference
이 문제에 관하여(JS 기호 교체기 및 생성기 - 연습), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/teachtyler/js-symbol-iterators-generators-an-exercise-3955텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)