产生Object值的`Symbol.iterator`

时间:2018-03-02 09:36:11

标签: javascript ecmascript-6 iterator

我写了这个

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]
}

哪个不起作用。

2 个答案:

答案 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