2017-12-09 5 views
1

これは、このソースコードである:iterator.next().valueの最初の呼び出しがオブジェクトを呼び出す上に生成されていない[Symbol.iterator]()

{"value":"James","key":"name","done":false} 

を印刷するようになっている

const james = { 
    name: 'James', 
    height: `5'10"`, 
    weight: 185, 
    [Symbol.iterator]:function*(){ 
    yield Object.keys(this) ; 
    } 
}; 
const iterator = james[Symbol.iterator](); 
// 
console.log(iterator.next().value); // 'James' 
console.log(iterator.next().value); // `5'10` 
console.log(iterator.next().value); // 185 

それが印刷され。これを解決するには?

+0

反復結果の「キー」はどこから来るのですか? 'Object.keys'は' ["name"、 "height"、 "weight"] 'という配列を生成します。 – Bergi

答えて

4

あなたはyieldすべてのキーを一度に表示します。あなたの最初のnextがすべて動作することを意味します。必要なのは、キーを反復して、順番にそれらをyieldすることです。

const james = { 
 
    name: 'James', 
 
    height: `5'10"`, 
 
    weight: 185, 
 
    [Symbol.iterator]:function*(){ 
 
     for(let key of Object.keys(this)) { 
 
      yield { propValue: this[key], propName: key};  
 
     }  
 
    } 
 
}; 
 

 
const iterator = james[Symbol.iterator](); 
 

 
console.log(iterator.next()); 
 
console.log(iterator.next()); 
 
console.log(iterator.next());

+0

値を印刷して終了しました。キー部分も印刷する必要があります。 – Karthik

+1

ジェネレータの戻り値の構文は '{value、done}'です。値には、値と名前を持つオブジェクトがあります。私は更新しました –

0

実は、これはあなたが探している解決策になる、それはあなたが出力にそれを必要とする正確に何を出力します。

const james = { 
    name: 'James', 
    height: `5'10"`, 
    weight: 185, 
    [Symbol.iterator]: function() { 
    let keys = Object.keys(this), index = 0; 
    return { 
     next:() => { 
     return { 
      key: keys[index], value: this[keys[index]], done: ++index >= keys.length 
     }; 
     } 
    } 
    } 
} 

const iterator = james[Symbol.iterator](); 

console.log(iterator.next().value); 
console.log(iterator.next().value); 
console.log(iterator.next().value); 
関連する問題