Как конвертировать простой итератор в генератор JavaScript - PullRequest
0 голосов
/ 09 мая 2018

CODEPEN

Пытаюсь обернуть голову вокруг генератора, а я просто не понимаю.

У меня есть простой итераторный класс, не называемый генератором, который называется KeyGen, который я хотел бы переписать с использованием генераторов JS :

Если это не то, что должны делать генераторы, пожалуйста, оставьте комментарий, и я закрою

class KeyGen {
  constructor(numOfKeys) {
    this.keys = new Array(numOfKeys).fill(0).map((i, index) => index);
    this.iteratorCount = 0;
  }

  keyIterator() {
    return {
      next: () => this.keys[this.iteratorCount++]
    }
  }
}

const keyGen = new KeyGen(4);

console.log(keyGen.keyIterator().next());
console.log(keyGen.keyIterator().next());
console.log(keyGen.keyIterator().next());
console.log(keyGen.keyIterator().next());

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Генератор подойдет, но вы должны заметить, что ваш исходный код не совпадает с генератором. Для генератора вызов next должен возвращать объект с двумя ключами, value и done.

Чтобы преобразовать в функцию генератора, вам просто нужно создать начальный список для повторения таким же образом, как сейчас, но затем вы можете просто использовать обычный цикл for для yield каждого элемента по одному.

Пример:

function* KeyGen(numOfKeys) {
    const keys = Array(numOfKeys)
      .fill(0)
      .map((i, index) => index);
      
    for (let key of keys) {
      yield key;
    }
}

const keyGen = KeyGen(4);

console.log(keyGen.next())
console.log(keyGen.next())
console.log(keyGen.next())
console.log(keyGen.next())
console.log(keyGen.next())

// For extra coolness, note that for/of loops are designed to work with generators:
for (let key of KeyGen(4)) {
    console.log(key)
}
0 голосов
/ 09 мая 2018

Это довольно просто, просто объявите массив, а затем yield каждый элемент:

function* gen(length) {
  const keys = Array.from({ length }, (_, i) => i);
  for (const key of keys) yield key;
}

const iter = gen(3);
console.log(iter.next().value);
console.log(iter.next().value);
console.log(iter.next().value);
...