【问题标题】:`Symbol.iterator` that yields Object's values`Symbol.iterator` 产生对象的值
【发布时间】:2018-08-10 12:08:45
【问题描述】:

这是我写的

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

这没用。

【问题讨论】:

  • 你实际上并没有调用[Symbol.iterator] 方法

标签: javascript ecmascript-6 iterator


【解决方案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

【讨论】:

  • 谢谢,yield star 是个好主意,总是忘记这个语法...
【解决方案2】:

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

【讨论】:

  • 谢谢。如果没有包装器功能,这可能吗? myObj[Symbol.iterator] = Object.values(myObj)[Symbol.iterator] 不起作用。
  • @georg Array.prototype[Symbol.iterator].bind(Object.values(myObj)),但请注意这会立即调用Object.value,而不是在迭代时
  • @georg 我不这么认为;但您可以创建适用于任何对象的单独函数(请参阅我的编辑)。
猜你喜欢
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 2015-08-27
  • 2019-12-09
  • 2017-03-02
  • 2015-07-26
  • 2015-09-09
相关资源
最近更新 更多