【发布时间】:2018-01-30 02:00:50
【问题描述】:
您好,我正在尝试弄清楚如何在符号迭代器中设置键,这是我目前拥有的代码:
let james = {
name: 'James',
height: `5'10"`,
weight: 185
};
james[Symbol.iterator] = function* () {
for (let key in this) {
yield this[key];
}
}
let 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": "James", "key": "name", "done": false}
但我得到了
{"value": "James", "done": false}
我想以某种方式设置“键”,就像设置“值”一样。
我查看了documentation,但我没有看到任何与此相关的文档。
有什么想法吗?
编辑
问题的用例基本上是将 James 对象 变成 可迭代对象,“如何”并不重要,所以我的第一次尝试是使用生成器,然后我意识到我需要以这种格式打印对象:
{ value: 'James', key: 'name', done: false }
{ value: '5\'10"', key: 'height', done: false }
{ value: 185, key: 'weight', done: true }
这不是标准的方法,所以我必须创建一个自定义方法来“实现”该行为:
感谢@loganfsmyth 为我指明了正确的方向,我想出了这个简单的解决方案:
let james = {
name: 'James',
height: `5'10"`,
weight: 185
};
james[Symbol.iterator] = function (){
const keys = [];
for (let key in this) {
keys.push({'key':key, 'value':this[key]});
}
return {
next(){
let {key,value} = keys.shift();
return {value,key,done:keys.length===0};
}
}
}
let iterator = james[Symbol.iterator]();
console.log(iterator.next().value); // 'James'
console.log(iterator.next().value); // `5'10`
console.log(iterator.next().value); // 185
【问题讨论】:
-
the call to iterator.next() should print ...为什么?迭代器显式产生value/done对象,你不能在那里有其他字段。
标签: javascript ecmascript-6 functional-programming iterator generator