调用[Symbol.iterator]()时不生成对象

问题描述 投票:1回答:2

这是源代码:

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}。怎么解决这个?

javascript ecmascript-6 iterator iterable
2个回答
4
投票

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

0
投票

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

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);
© www.soinside.com 2019 - 2024. All rights reserved.