如何在javascript中克隆迭代器? [英] How to clone an Iterator in javascript?

查看:191
本文介绍了如何在javascript中克隆迭代器?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

In ES6, is there any possible to clone an iterator states?

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

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

if I want to remember here the it states how should I do in javascritp?

它的重新编号是什么?

what is remebered in it? since the

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


推荐答案

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

You can’t clone an arbitrary iterator, but you can create many distinct iterators from one by holding onto some state:

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中克隆迭代器?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆