调用 [Symbol.iterator]() 时未生成对象
Object is not being produced on calling [Symbol.iterator]()
这是这个源代码:
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);
这是这个源代码:
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);