【问题标题】:Object is not being produced on calling [Symbol.iterator]()调用 [Symbol.iterator]() 时未生成对象
【发布时间】:2018-05-23 08:37:47
【问题描述】:

这是源代码:

const james = {
    name: 'James',
    height: `5'10"`,
    weight: 185,
    [Symbol.iterator]:function*(){
    yield Object.keys(this) ;   
    }
};
const iterator = james[Symbol.iterator]();
//
console.log(iterator.next().value); // 'James'
console.log(iterator.next().value); // `5'10`
console.log(iterator.next().value); // 185

第一次调用iterator.next().value 应该打印

{"value":"James","key":"name","done":false}

但它正在打印{"value":["name","height","weight"],"done":false}。如何解决这个问题?

【问题讨论】:

  • 迭代结果中的key 来自哪里? Object.keys 生成数组 ["name","height","weight"],仅此而已。

标签: javascript ecmascript-6 iterator iterable


【解决方案1】:

yield 一次所有的键。意味着您的第一个next 完成所有工作。您只需要按顺序遍历键和yield

const james = {
    name: 'James',
    height: `5'10"`,
    weight: 185,
    [Symbol.iterator]:function*(){   
       for(let key of Object.keys(this)) {
          yield  { propValue: this[key], propName: key};       
       }       
    }
};

const iterator = james[Symbol.iterator]();

console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());

【讨论】:

  • 它正在打印值并完成。它还应该打印关键部分。
  • 生成器返回值的语法是{ value, done }。您可以在值处拥有一个具有属性值和名称的对象。我已经更新了
【解决方案2】:

实际上,这将是您正在寻找的解决方案,它会准确输出您需要输出的内容。

const james = {
  name: 'James',
  height: `5'10"`,
  weight: 185,
  [Symbol.iterator]: function() {
    let keys = Object.keys(this), index = 0;
    return {
      next: () => { 
        return {
          key: keys[index], value: this[keys[index]], done: ++index >= keys.length 
        };  
      }
    }
  }
}

const iterator = james[Symbol.iterator]();

console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);

【讨论】:

    猜你喜欢
    • 2018-08-10
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2021-10-04
    • 2012-08-17
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多