Как переслать итератор? - PullRequest
1 голос
/ 02 мая 2020

У меня есть маленький класс:

class FreqDict<K> {
    private readonly map: Map<K,number>

    constructor() {
        this.map = new Map;
    }

    inc(key: K): void {
        const n = this.map.get(key);
        this.map.set(key, n ? n+1 : 1);
    }

    *[Symbol.iterator]() {
        for(const item of this.map) {
            yield item;
        }
    }

    entries() {
        return Array.from(this.map.entries())
    }
}

Вы можете видеть, как я реализовал итератор, и это прекрасно работает, но у this.map уже есть итератор. Я не могу просто вернуть / переслать? Я не уверен, каков правильный синтаксис. return this.map[Symbol.iterator] не похоже на работу.

1 Ответ

1 голос
/ 02 мая 2020

Синтаксис yield * можно использовать для делегирования собственному итератору объекта Map.

Согласно MDN docs :

The * Выражение 1010 * используется для делегирования другому генератору или итерируемому объекту.

В приведенном ниже фрагменте кода я делегирую итератору map с использованием синтаксиса yield*, поскольку Map является Iterable тип:

class FreqDict {
    constructor() {
        this.map = new Map();
    }
    inc(key) {
        const n = this.map.get(key);
        this.map.set(key, n ? n+1 : 1);
    }
    *[Symbol.iterator]() {
        yield* this.map;
    }
    entries() {
        return Array.from(this.map.entries())
    }
}
const dict = new FreqDict();
dict.inc("a");
dict.inc("a");
dict.inc("a");
dict.inc("b");
dict.inc("b");

for (const [key, freq] of dict){
  console.log(key, "::", freq);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...