我有这样的数据结构
const array = [
[["first_name" , "First"], ["image" , "image"]],
[["email" , "email"]],
[["last_name","last_name"]],
[["password" , "password"], ["password", "password"]]
]
我的迭代器实现是
let arr = array.values();
let obj = {
[Symbol.iterator]: function () {
return {
next() {
for (const iterator of arr) {
for (let [, value] of iterator) {
return {
done: false,
value,
};
}
}
return {
done: true,
};
},
};
},
}
但是当我迭代它时
[...obj]
我只得到二维数组的第一个元素
我得到的输出是
["First" , "email" , "last_name" , "password"]
预期产出
["First" , "image" , "email" , "last_name" , "password", "password"]
嵌套 for..in 仅迭代嵌套数组的第一个元素
注意:- 上述解决方案与 Symbol.Iterator 生成器函数一起工作正常
就像Nenad Vracar的答案一样,由于它是从内部for循环语句返回的,因此它不会循环所有内部数组,只有外部数组循环并结束。
必须能够保存各个状态,以单独使用
Symbol.iterator
实现您想要的功能,而无需使用 Generator
。
const array = [
[["first_name" , "First"], ["image" , "image"]],
[["email" , "email"]],
[["last_name","last_name"]],
[["password" , "password"], ["password", "password"]]
];
const obj = {
[Symbol.iterator]: () => {
return {
stack: [...array],
target: [],
next() {
if (!this.target.length && !this.stack.length) return {
done: true,
value: undefined,
}
if (!this.target.length) this.target = this.stack.shift();
return {
done: false,
value: this.target.shift()[1],
};
},
}
}
};
console.log([...obj]); // ['First', 'image', 'email', 'last_name', 'password', 'password']
前面已经提到过,您从第一次迭代中就退出了内部循环,因此下次执行
return
时,您可以从 next
迭代器获取下一个值,从而跳过内部循环的任何迭代如果你没有摆脱它,一个人仍然会表演。但从 ECMAScript 2025 开始,有 迭代器辅助方法:您可以将其链接到输入迭代器。它需要一个函数作为参数,返回一个可迭代对象来进行(子)迭代,但在您的情况下,您只想提供子数组本身进行迭代,因此您可以传递一个恒等函数。就像
flatMap
一样(正如你所期望的一个对象)。在该方法调用之后,您可以链接更多辅助方法,例如
Object
:
map