javascript - Hur implementerar jag en cykel-genom en array med en generatorfunktion


Idag undrade jag vilket som skulle vara det snabbaste sättet att tillhandahålla en cykelgenom-array i TypeScript, såsom:

['one', 'two', 'three'] 

där nästa värde efter three skulle vara one, och jag tyckte att det är en bra kandidat för en generatorfunktion. Men det verkar inte fungera för mig. Vad är fel med följande kod?

function* stepGen(){
  const steps = ['one', 'two', 'three'];

  let index = 0;

  if(index < steps.length - 1){
   index++;
  } else {
   index = 0;
  }
  yield steps[index];
}

let gen = stepGen();
console.log(gen.next().value); 
console.log(gen.next().value);
console.log(gen.next().value); // should be 'three'
console.log(gen.next().value); // should be 'one'
console.log(gen.next().value);

Svar #1

Du behöver en loop i din generator-kod, annars sker bara en yield:

function* stepGen(steps){
  let index = 0;
  while (true) {
    yield steps[index];
    index = (index+1)%steps.length;
  }
}

let gen = stepGen(['one', 'two', 'three']); // pass array to make it more reusable
console.log(gen.next().value); 
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);

Alternativt kan du också använda yield* som returnerar värden från en itererbar, ett i taget:

function* stepGen(steps){
  while (true) yield* steps;
}

let gen = stepGen(['one', 'two', 'three']);
console.log(gen.next().value); 
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);
console.log(gen.next().value);

Relaterade artiklar