如何在 JavaScript 中克隆迭代器?

use*_*909 5 javascript iterator ecmascript-6

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

var ma=[1,2,3,4];
var it=ma[Symbol.iterator]();
it.next();
Run Code Online (Sandbox Code Playgroud)

如果我想记住这里它指出我应该在javascritp中做什么?

里面记着什么?自从

JSON.stringify(it) //it would just return {}
Run Code Online (Sandbox Code Playgroud)

Ry-*_*Ry- 4

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

\n\n
function tee(iterable) {\n    const source = iterable[Symbol.iterator]();\n    const buffers = [[], []];  // substitute in queue type for efficiency\n    const DONE = Object.create(null);\n\n    const next = i => {\n        if (buffers[i].length !== 0) {\n            return buffers[i].shift();\n        }\n\n        const x = source.next();\n\n        if (x.done) {\n            return DONE;\n        }\n\n        buffers[1 - i].push(x.value);\n        return x.value;\n    };\n\n    return buffers.map(function* (_, i) {\n        for (;;) {\n            const x = next(i);\n\n            if (x === DONE) {\n                break;\n            }\n\n            yield x;\n        }\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

用法:

\n\n
const [a, b] = tee(iterator);\nassert(a.next().value === b.next().value);\n
Run Code Online (Sandbox Code Playgroud)\n