簡體   English   中英

如何克隆 javascript 中的迭代器?

[英]How to clone an Iterator in javascript?

在 ES6 中,是否有可能克隆迭代器狀態?

var ma=[1,2,3,4];
var it=ma[Symbol.iterator]();
it.next();

如果我想在這里記住它說明我應該如何在 javascritp 中執行?

里面有什么記憶? 自從

JSON.stringify(it) //it would just return {}

無法克隆迭代器。 迭代器狀態基本上是完全任意的,任何給定的迭代器可能會要求或產生副作用(例如,從網絡流讀取或寫入網絡流),這些副作用無法按需重復。

您不能克隆任意迭代器,但是可以通過保持某種狀態來從一個迭代器創建許多不同的迭代器:

function tee(iterable) {
    const source = iterable[Symbol.iterator]();
    const buffers = [[], []];  // substitute in queue type for efficiency
    const DONE = Object.create(null);

    const next = i => {
        if (buffers[i].length !== 0) {
            return buffers[i].shift();
        }

        const x = source.next();

        if (x.done) {
            return DONE;
        }

        buffers[1 - i].push(x.value);
        return x.value;
    };

    return buffers.map(function* (_, i) {
        for (;;) {
            const x = next(i);

            if (x === DONE) {
                break;
            }

            yield x;
        }
    });
}

用法:

const [a, b] = tee(iterator);
assert(a.next().value === b.next().value);

我建立了一個庫,允許您在這里分叉一個迭代器: https://github.com/tjenkinson/forkable-iterator

意味着您可以執行以下操作:

import { buildForkableIterator, fork } from 'forkable-iterator';

function* Source() {
  yield 1;
  yield 2;
  return 'return';
}

const forkableIterator = buildForkableIterator(source());

console.log(forkableIterator.next()); // { value: 1, done: false }

const child1 = fork(forkableIterator);
// { value: 2, done: false }
console.log(child1.next());
// { value: 2, done: false }
console.log(forkableIterator.next());

// { value: 'return', done: true }
console.log(child1.next());
// { value: 'return', done: true }
console.log(forkableIterator.next());

如果您不再需要繼續從 fork 中消費,為您提供對它的松散引用,那么也不應該存在 memory 泄漏。

它還不是官方的,但我認為Iterator Helpers的第 2 階段提案中可能有一個解決方案。 如果這些方法不影響原始迭代器,那么執行iter.take(Infinity)iter.drop(0)之類的操作將具有與克隆相同的效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM