迭代关联对象js

iteration associated object js

我想在对象中使用 Symbol.iterator 来迭代关联对象

我需要return循环中的所有键和所有值

这是我的输出:

let price = {
    money:2000,
    edit_photo:{
        yes:100,
        no:0
    },
    photo_type:{
        personal:300,
        sport:400,
        fashion:500,
        commercial:600
    },
    [Symbol.iterator](){
        let items = Object.keys(this);
        let step = 0;
        return{
            next(){
                let object = {
                    done: step >= items.length,
                    value: items[step]
                }
                step++;
                return object;
            }
        }
    }
}
for (let item of price) {
    console.log(item)
}

我无法滚动所有值

Symbol.iterator 的格式不正确。 Symbol.iterator 在技术上是 generator 而不是迭代器。 generator 函数需要用 *.

标记
const someObj = {
  *[Symbol.iterator]() {
    yield 'a';
    yield 'b';
  }
}

这样你的对象就知道将它实际用作 generator 函数。

现在我们使用了正确类型的函数,我们必须 return 正确类型的值。嗯,yield 正确的值类型。

由于您正在寻找 return 每个对象项的 keyvalue,我们正在 yielding 的对象可能如下所示:

yield {
  done: false,
  key: items[step],
  value: this[items[step]]
}

为了确保我们生成对象的每个项目,我们将其放在 while 循环中。

while (steps < items.length) {
  yield { /* ... */ };
  step++;
}

一旦 while 循环退出,我们就 yield 我们的最终对象。

yield {
  done: true,
  value: this,
};

基于您的示例的完整代码如下。引用我的来源:MDN here.

let price = {
  money:2000,
  edit_photo:{
    yes:100,
    no:0
  },
  photo_type:{
    personal:300,
    sport:400,
    fashion:500,
    commercial:600
  },
  *[Symbol.iterator](){
    let items = Object.keys(this);
    let step = 0;
    while (step < items.length) {
      yield {
        done: false,
        key: items[step],
        value: this[items[step]]
      };
      step++;
    }
    yield {
      done: true,
      value: this,
    }
  }
}

for (let item of price) {
  console.log(item);
}