지연 목록을 처리하는 라이브러리 및 Stage 2 Iterator Helpers

이동전화 인터페이스


ES 2015Iterable 인터페이스를 구현한 대상for-of과 스프레드시트를 사용할 수 있다.인터페이스에 대한 자세한 내용은 qnighy의 보도를 보십시오.
https://zenn.dev/qnighy/articles/112af47edfda96

지연 목록을 처리하는 라이브러리


정수를 포함하는 그룹이 존재한다고 가정하십시오.우리는 이 수조의 제곱 원소에 원소를 추가한 후에 짝수만 얻는 것을 고려했다.우직하게 실시한다면 다음과 같다.
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의 반환IterableIteratorGenerator, 그렇지 않으면 반환 배열[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,
  );
https://github.com/nvie/itertools.js

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();
https://danieltao.com/lazy.js/

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),
  ),
);
https://github.com/ReactiveX/IxJS

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();
https://github.com/tc39/proposal-iterator-helpers

인터페이스 및%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]로 돌아가는 것이다.
이것은 원래의 실례returnthrow 방법이 정의된 상황에서 그것을 잘 계승하기 위한 것이다.
https://tc39.es/proposal-iterator-helpers/#sec-iterator-helper-objects

재활용 불가


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 );
https://github.com/tc39/proposal-array-from-async

매듭을 짓다


이번에는 Iterator Helpers를 소개합니다.편리하지만 워낙 복잡한 자바스크립트의 모바일 전화 주변 규격이 더 복잡해진다는 인상을 준다.
예전에 Iterator라고 한 말은 그 인터페이스를 가리키는데, 앞으로는 Iterator반을 의미할 수도 있다.Type Script의 유형 정의는 도대체 어떻게 되는가....
ECMAScript를 추구하는 제안이 즐거우실 텐데 여러분도 괜찮으시면 잘 부탁드립니다.
각주
상관없어요. imap라는 함수명이라면 메일의 프로토콜을 연상하겠죠.↩︎
사용Promise.resolve과 유사하게 ThenablePromise화한다.↩︎
Iterator.from가 함수를 사용한 경우 이 매개 변수가 Iterator류의 실례[[Prototype]]를 계승하지 않으면 %WrapForValidIteratorPrototype%를 가진 실례를 되돌려준다.복잡해.↩︎
엄밀히 말하면 IxJS의from 함수는 Iterable뿐만 아니라 설치Iterator 인터페이스의 대상도 포함할 수 있어 이런 상황에서도 재사용할 수 없다.↩︎
나는 반의 실례를 복제하는 방법을 원한다. Iterator. 그러나 그것은 순조롭지 않다.하나tee를 대기열에 간단하게 놓고 다른 하나를 재활용하는 것은 가능하지만 IteratorResult 방법에 매개 변수를 넣는 상황nextreturn 방법의 처리 등을 고려하면 어렵다.↩︎

좋은 웹페이지 즐겨찾기