【问题标题】:Method to produce key, value and done in the format {value: .. , key: .. , done: ..}以 {value: .. , key: .. , done: ..} 格式生成键、值和完成的方法
【发布时间】:2018-05-24 05:51:30
【问题描述】:

.next() 方法返回一个具有两个属性的对象,即 value 和 done。是否有一种方法可以将键与值一起返回并完成?代码如下:

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

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

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

这段代码的输出是:

{ value: 'James', done: false }
{ value: '5\'10"', done: false }
{ value: 185, done: false }

预期输出:

{ value: 'James', key: 'name', done: false }
{ value: '5\'10"', key: 'height', done: false }
{ value: 185, key: 'weight', done: false }

【问题讨论】:

  • 对于生成器函数?不,他们只是发出一个值并完成。你想归还什么钥匙?你能不能把yield你想要的所有数据都作为一个对象?
  • 对象属性的key:value对中的key
  • 什么对象?请向我们展示整个用例。你是否像我猜的那样使用生成器?
  • 好的..我会更新它..
  • 我更新了代码..

标签: javascript ecmascript-6


【解决方案1】:

您将在生成器中获得最接近的方法是自己生成对象

yield {key: key, value: this[key]};

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

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

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

【讨论】:

    【解决方案2】:

    您可以创建自己的迭代包装函数,如下所示:

    const james = {
        name: 'James',
        height: `5'10"`,
        weight: 185,
    };
    
    // Custom iterator wrapper
    const iterate = (obj) => {
      function* iter(){   
           for(let key of Object.keys(obj)) {
              yield {key: key, value: obj[key]}; 
           }
      }
      return () => {
        const r = iter().next();
        return {key: r.value.key, value: r.value.value, done: r.done};
      }
    }
    
    
    const next = iterate(james);
    
    console.log( next() ); 
    console.log( next() ); 
    console.log( next() );

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-27
      • 2015-11-22
      • 1970-01-01
      相关资源
      最近更新 更多