我写了这个
myObj = {
x: 1,
y: 2,
z: 3,
};
myObj[Symbol.iterator] = function* () {
for (let val of Object.values(this))
yield val;
};
for(let x of myObj)
console.log(x); // 1,2,3
这样可行,但看起来不必要了。有没有办法以更直接的方式表达同样的东西?基本上,我正在寻找的是一个简单的表达式,说“这个对象的迭代器是它的值迭代器”。我试过了
myObj[Symbol.iterator] = function () {
return Object.values(this)[Symbol.iterator]
}
哪个不起作用。
答案 0 :(得分:1)
接近你需要call the iterator并使用yield*
来返回另一个迭代器的值。
myObj = { x: 1, y: 2, z: 3 };
myObj[Symbol.iterator] = function* () {
yield* Object.values(this);
};
for(let x of myObj)
console.log(x); // 1,2,3
答案 1 :(得分:1)
Object.values(this)[Symbol.iterator]
是一个返回迭代器的函数。您应该返回调用它的结果(迭代器):
const myObj = {
x: 1,
y: 2,
z: 3,
};
myObj[Symbol.iterator] = () => Object.values(myObj)[Symbol.iterator]();
for (const x of myObj)
console.log(x); // 1,2,3
您还可以创建一个单独的函数,该函数可以与任何对象一起使用:
const myObj = {
x: 1,
y: 2,
z: 3,
};
const iterator = function() {
return Object.values(this)[Symbol.iterator]();
};
myObj[Symbol.iterator] = iterator;
for (const x of myObj)
console.log(x); // 1,2,3