【问题标题】:How to clone an Iterator in javascript?如何在 javascript 中克隆一个迭代器?
【发布时间】:2018-03-07 01:49:24
【问题描述】:

在 ES6 中,是否有可能克隆迭代器状态?

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

如果我想在这里记住它说明我应该如何在 javascritp 中执行?

里面有什么记忆? 自从

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

【问题讨论】:

标签: javascript ecmascript-6 iterator


【解决方案1】:

您不能克隆任意迭代器,但您可以通过保持某种状态从一个迭代器中创建许多不同的迭代器:

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);

【讨论】:

    【解决方案2】:

    无法克隆迭代器。迭代器状态基本上是完全任意的,任何给定的迭代器都可能需要或产生不可按需重复的副作用(例如,读取或写入网络流)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-10
      • 2020-10-19
      • 2012-01-06
      • 2015-09-16
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-26
      相关资源
      最近更新 更多