这是源代码:
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
第一次打电话给iterator.next().value
应打印
{"value":"James","key":"name","done":false}
但它正在打印{"value":["name","height","weight"],"done":false}
。怎么解决这个?
你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());
实际上,这将是您正在寻找的解决方案,它输出您需要输出的确切内容。
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);