지연 목록을 처리하는 라이브러리 및 Stage 2 Iterator Helpers
25664 단어 JavaScriptECMAScripttech
이동전화 인터페이스
ES 2015
Iterable
인터페이스를 구현한 대상for-of
과 스프레드시트를 사용할 수 있다.인터페이스에 대한 자세한 내용은 qnighy의 보도를 보십시오.지연 목록을 처리하는 라이브러리
정수를 포함하는 그룹이 존재한다고 가정하십시오.우리는 이 수조의 제곱 원소에 원소를 추가한 후에 짝수만 얻는 것을 고려했다.우직하게 실시한다면 다음과 같다.
const arr = [];
for (let i = 0; i < 100000; ++i) {
arr[i] = i;
}
const result = arr
.map((val) => val * val)
.map((val) => val + 1)
.filter((val) => val % 2 === 0);
이 실시에 문제가 있다.Array#map
배열에서 새로 배열하는 방법이기 때문에 매번 메모리를 확보하고 소모한다.성능이 나쁘다.이 문제를 해결하는 방법의 하나는 바로 lazy를 실행하는 것이다.마지막으로 필요하기 전에 줄을 서지 않으면 불필요한 메모리 사용을 방지할 수 있다.
itertools.js
파이톤의itertools 포트를 자바스크립트에 연결하는 프로그램 라이브러리가 있습니다.Generation의 서신관 수를 사용하여 실현하였다.
편지봉투 i의 반환
IterableIterator
Generator
, 그렇지 않으면 반환 배열[1].import { imap, filter } from "itertools";
const arr = [];
for (let i = 0; i < 100000; ++i) {
arr[i] = i;
}
const result =
filter(
imap(
imap(
arr,
(val) => val * val,
),
(val) => val + 1,
),
(val) => val % 2 === 0,
);
Lazy.js
자바스크립트에 아직 이동전화가 없는 시대에 제작된 레이지.js라는 도서관이 있어요.혼자 설치
Sequence
류 제작.import Lazy from "lazy.js";
const arr = [];
for (let i = 0; i < 100000; ++i) {
arr[i] = i;
}
const result = Lazy(arr)
.map((val) => val * val)
.map((val) => val + 1)
.filter((val) => val % 2 === 0)
.toArray();
IxJS
Push-based Streams의 RxJS는 유명하지만 그와 상대적으로 Pull-based Streams의 IxJS다.혼자 설치
IterableX
류 제작.import { from, toArray } from "ix/iterable";
import { map, filter } from "ix/iterable/operators";
const arr = [];
for (let i = 0; i < 100000; ++i) {
arr[i] = i;
}
const result = toArray(
from(arr).pipe(
map((val) => val * val),
map((val) => val + 1),
filter((val) => val % 2 === 0),
),
);
Stage 2 Iterator Helpers
이 제안은 역시 Stage 2입니다.규격이 변경될 가능성이 있다.
%IteratorPrototype%
와 %AsyncIteratorPrototype%
의 새로운 추가 방법 제안은 Stage 2 Iterator Helpers입니다.const arr = [];
for (let i = 0; i < 100000; ++i) {
arr[i] = i;
}
// Array#values で Iterator クラスを継承したインスタンスを作る
const result1 = arr.values()
.map((val) => val * val)
.map((val) => val + 1)
.filter((val) => val % 2 === 0)
.toArray();
// もしくは Iterator.from で Iterator クラスを継承したインスタンスを作る
const result2 = Iterator.from(arr)
.map((val) => val * val)
.map((val) => val + 1)
.filter((val) => val % 2 === 0)
.toArray();
인터페이스 및%IteratorProtoype
for-of
와 전자문법Iterable
은 인터페이스를 설치하면 사용할 수 있다.그러나 이 제안의 방법Iterator
은 인터페이스만으로는 부족하고 원형 체인에 %IteratorPrototype%
이 없으면 사용할 수 없다.Generation 함수를 사용하지 않고
Iterator
인터페이스를 혼자 설치하면 전 세계Iterator
류를 계승해야 한다.class MyIterator extends Iterator {
next() {}
return() {}
throw() {}
}
또는 사용 방법 이전Iterator.from
으로 전환해도 된다[2].%IteratorHelperPrototype%
Iterator Helpers 방법을 사용하는 경우 단순히
[[Prototype]]
%IteratorPrototype%
Iterator.prototype
의 실례가 있는 것이 아니라 한 단계 더 나아가 랩%IteratorHelperPrototype%
의 실례[3]로 돌아가는 것이다.이것은 원래의 실례
return
와 throw
방법이 정의된 상황에서 그것을 잘 계승하기 위한 것이다.재활용 불가
Iterator Helpers 방법에서는 교체기를 더 이상 사용할 수 없습니다.
이거 레이지야.js 및 IxJS와 다른 피쳐입니다.Lazy.js와 IxJS에서는 독립류에서 원본으로 배열된 참조를 보존하기 때문에 여러 번
toArray
에 배열[4]을 할 수 있다.다른 한편, 현지인Iterator
반에서는 그것을 할 수 없다.나는 이것이 문제없다고 생각하지만, 같은 절차에 따라 이동전화를 만들거나, 먼저 줄을 서서 처리해야 한다. [5]
관련 건의
Iterable
인터페이스가 설치된 대상에서 배열Array.from
이 있었지만AsyncIterable
인터페이스에서 배열 함수는 현재 없다.이 블렌드 블록을 채우자는 제안은 스테이지 1Array.fromAsync
이다.const arr = [];
for (let i = 0; i < 100000; ++i) {
arr[i] = i;
}
const iterator = arr.values()
.map((val) => val * val)
.map((val) => val + 1);
// この Iterator#toArray で iterator を完了状態にする
const mapped = iterator.toArray();
// iterator は既に完了しているため、空配列になってしまう
const filtered = iterator
.filter((val) => val % 2 === 0)
.toArray();
console.assert( filtered.length === 0 );
매듭을 짓다
이번에는 Iterator Helpers를 소개합니다.편리하지만 워낙 복잡한 자바스크립트의 모바일 전화 주변 규격이 더 복잡해진다는 인상을 준다.
예전에
Iterator
라고 한 말은 그 인터페이스를 가리키는데, 앞으로는 Iterator
반을 의미할 수도 있다.Type Script의 유형 정의는 도대체 어떻게 되는가....ECMAScript를 추구하는 제안이 즐거우실 텐데 여러분도 괜찮으시면 잘 부탁드립니다.
각주
상관없어요.
imap
라는 함수명이라면 메일의 프로토콜을 연상하겠죠.↩︎ 사용
Promise.resolve
과 유사하게 Thenable
화Promise
화한다.↩︎ Iterator.from
가 함수를 사용한 경우 이 매개 변수가 Iterator
류의 실례[[Prototype]]
를 계승하지 않으면 %WrapForValidIteratorPrototype%
를 가진 실례를 되돌려준다.복잡해.↩︎ 엄밀히 말하면 IxJS의
from
함수는 Iterable
뿐만 아니라 설치Iterator
인터페이스의 대상도 포함할 수 있어 이런 상황에서도 재사용할 수 없다.↩︎ 나는 반의 실례를 복제하는 방법을 원한다.
Iterator
. 그러나 그것은 순조롭지 않다.하나tee
를 대기열에 간단하게 놓고 다른 하나를 재활용하는 것은 가능하지만 IteratorResult
방법에 매개 변수를 넣는 상황next
과 return
방법의 처리 등을 고려하면 어렵다.↩︎ Reference
이 문제에 관하여(지연 목록을 처리하는 라이브러리 및 Stage 2 Iterator Helpers), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/petamoriken/articles/062461b79e0d8f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)