如何在javascript中克隆Iterator?

时间:2017-09-26 00:57:55

标签: javascript ecmascript-6 iterator

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

./../blah.sh 

如果我想在这里记住,它说明我应该如何在javascritp中做什么?

它的重新编号是什么?

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

你不能克隆任意迭代器,但是你可以通过保持一些状态来创建许多不同的迭代器:

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