如何使用生成器函数实现数组循环遍历

6
今天我在思考如何用TypeScript提供最快的循环数组方法,例如:
['one', 'two', 'three'] 

three之后的下一个值应该是one,我认为这是生成器函数的一个好候选。然而,它似乎对我不起作用。以下代码有什么问题?

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

你的生成器代码需要有一个循环。 - trincot
1个回答

11

你的生成器代码中需要一个循环,否则只会发生一次 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);

或者您也可以使用 yield*,它可以逐个从可迭代对象中生成值:

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


如果您将数组作为参数传递,它将立即成为OP可用的块。 - Balázs Édes
@BalázsÉdes,谢谢,我已经采纳了你的改进建议。 - trincot
没错,@BalázsÉdes是对的 - 我也在发现新东西的力量,比如Map、Set或生成器。我曾经不确定自己是否需要一个生成器,但有了这样的语法,它就像一个梦想。不过我很好奇,为什么在JavaScript 1.7或TypeScript下尝试运行此代码时,jsfiddle.net会报错。只能在fiddle中选择常规JavaScript选项。 - user776686
似乎可以在Javascript 1.7中工作,但是jsfiddle中的TypeScript版本不支持yield。我猜它不是1.6版本。 - trincot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接