2016-12-30 3 views
2

今日発電機能付きサイクルスルー配列を実装するにはどうすればよい:私はのように、活字体でサイクルスルーアレイを提供するswiftest方法だろうと思いまし

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

どこ次の値をthreeの後にはoneとなり、それはジェネレータ機能のための良い候補だと思いました。しかし、それは私にとってはうまくいかないようです。次のコードで何が問題になっていますか? 、

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

またあなたものiterableから値を得yield*を使用することができます。

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

ジェネレータコードにループが必要です。 – trincot

答えて

5

あなたがそうでない場合のみ、1 yield起こっている、あなたの発電機のコードのループを必要とします1つずつ:

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

+0

また、配列を引数として取ると、OP –

+0

@BalázsÉdesのためのすぐに使えるブロックです。この改善アイデアを取り入れました。 – trincot

+0

は本当に2番目のものが好きで、今日何か新しいことを学んだ:) –

関連する問題