Symbol.iterator:获取迭代器对象中的所有对象属性

时间:2017-07-14 11:51:32

标签: javascript ecmascript-6 iterator symbols

我目前正在阅读有关Symbols and Iterators(ES6功能)的内容,在进入示例后,我试图使对象可迭代,以便我可以使用for...of功能。从这里的几个例子/答案/我检查过的文章来看,它看起来像这样:



let obj = {
  prop1: 5,
  prop2: 'test',
  prop3: new Date(),
  [Symbol.iterator]: () => ({
  items: obj.items,
  next: function next() {
    return {
        done: this.items.length === 0,
        value: this.items.shift()
      }
  }
  })
};
Object.defineProperty(obj, "items", {
  enumerable: false,
  get: function() {
      let props = [];
      for(let prop in this) if(this.hasOwnProperty(prop)) props.push(this[prop]);
      return props;
  }
});
for(let prop of obj) console.log(prop);




但是我觉得在items迭代器数组中手动​​列出对象属性的所有值都很烦人。 Object.defineProperty感觉又脏又乱。我有点尝试从link扩展示例。是否有更智能/更简单的方法来获取迭代器中的所有对象属性(而不是items: obj.items和相关的膨胀或手动列出items: [5, 'test', new Date()]等项目?

3 个答案:

答案 0 :(得分:1)

您不应该使用items getter,而只是在迭代器方法中创建数组。您还可以使用生成器语法来创建迭代器,这样更容易。

但实现目标的最简单方法是

let obj = {
  prop1: 5,
  prop2: 'test',
  prop3: new Date(),
  [Symbol.iterator]() { return Object.keys(this).map(k => this[k])[Symbol.iterator](); }
};

答案 1 :(得分:1)

你可以在符号迭代器中返回一个生成器:

[Symbol.iterator]:function*(){
    for(value of Object.values(this)){
      yield value;//may extend this to your needs
    }
 }

或者在你的情况下:

[Symbol.iterator]:function*(){
  var i=1;
  while(this["prop"+i]){
      yield this["prop"+i];//may extend this to your needs
      i++;
  }
}

http://jsbin.com/zekunalusi/edit?console

答案 2 :(得分:1)

function objectEntries(obj) {
    let index = 0;

    // In ES6, you can use strings or symbols as property keys,
    // Reflect.ownKeys() retrieves both
    let propKeys = Reflect.ownKeys(obj);

    return {
        [Symbol.iterator]() {
            return this;
        },
        next() {
            if (index < propKeys.length) {
                let key = propKeys[index];
                index++;
                return { value: [key, obj[key]] };
            } else {
                return { done: true };
            }
        }
    };
}

let obj = { first: 'Jane', last: 'Doe' };
for (let [key,value] of objectEntries(obj)) {
    console.log(`${key}: ${value}`);
}

N2153