gpt4 book ai didi

javascript - 在 Javascript 生成器函数中设置键

转载 作者:行者123 更新时间:2023-11-29 16:05:01 25 4
gpt4 key购买 nike

您好,我正在尝试弄清楚如何在符号迭代器中设置 key ,这是我目前拥有的代码:

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

最佳答案

如果你想产生键和值,你需要产生一个包含两个项目的数组,例如

yield [key, this[key]];

然后对象上的 .value 将是键/值对。

另请注意,此行为类似于您从 Object.entries(james) 获得的行为,这是 ES2017 中添加的新函数,只是它返回一个 Array .

如果明确想要

.next()

要返回一个同时具有keyvaluedone 的对象,那么答案是您不能使用生成器来做到这一点。这不是生成器提供的 API,也不是 ES6 中定义的迭代器协议(protocol),因此您不应该使用迭代器来尝试执行此操作。

当然可以

james.makeCustomThing = function(){ 
const pairs = [];
for (const key in this) pairs.push([key, this[key]]);
return {
next(){
if (pairs.length === 0) return {done: true};

let [key, value} = pairs.shift();
return {key, value, done: false};
},
};
};

但它不再是迭代器,它只是您自己定义的自定义事物。

关于javascript - 在 Javascript 生成器函数中设置键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45806518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com