javascript - 如何在 javascript 中克隆迭代器?

标签 javascript ecmascript-6 iterator

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

关于javascript - 如何在 javascript 中克隆迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46416266/

相关文章:

Javascript 用 mousemove 绘制一个 div

javascript - jQuery .flip() 在 2 秒间隔内不起作用

javascript - React Native 的选择器元素项无效 [在 iOS 中运行]

javascript - 导出默认值有效,但在 React 中导出任何其他内容都不起作用

javascript - 发现隐含的强制转换?

javascript - 尝试向 jQuery 对象添加 HTML 类属性

javascript - OnClientClick 调用两个函数

iterator - 使用 Peekable 实现 "cautious"take_while

java - 如何使用 JAVA 8 从 map 中获取第一个键值?

javascript - Redux Saga - 产量生成 takeEvery 调用无过载