【问题标题】:iteration associated object js迭代关联对象js
【发布时间】:2021-03-07 18:52:41
【问题描述】:

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

我需要在循环中返回所有键和所有值

这是我的输出:

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

我无法滚动所有值

【问题讨论】:

  • 您在这里要解决的实际问题是什么?您尝试的代码的行为是什么?而你希望它变成什么?
  • @Code-Apprentice 我需要返回所有键和值

标签: javascript object iteration


【解决方案1】:

您的Symbol.iterator 格式错误。 Symbol.iterator 在技术上是 generator 而不是迭代器。 generator 函数需要用* 标记。

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

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

现在我们使用了正确类型的函数,我们必须返回正确类型的值。好吧,yield 正确的值类型。

由于您希望为每个对象项返回keyvalue,我们yielding 的对象可能如下所示:

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

为了确保我们产生对象的每一项,我们将它放在一个while循环中。

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

一旦while 循环退出,我们将产生最终对象。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多