迭代es6中的对象

时间:2016-12-16 09:45:04

标签: ecmascript-6

这对我来说很好用:

const iterable = [1, 2, 3];

for (const value of iterable) {
    console.log(value);
}

然而,这不起作用:

const iterable = {1:10, 2:20, 3:30};

for (const value of iterable) {
    console.log(value);
    console.log(iterable[value]);
}

反而给我错误:

Uncaught TypeError: iterable[Symbol.iterator] is not a function(…)

我该怎么做?

这就是我现在所做的:

for(const value in iterable){
    if (iterable.hasOwnProperty(value)) {
        console.log(value);
        console.log(iterable[value]);
    }
}

1 个答案:

答案 0 :(得分:13)

for..of仅适用于iterable objects。你可以实现这样的迭代器:

const iterable = {
  [Symbol.iterator]() {
    return {
      i: 1,
      next() {
        if (this.i <= 3) {
          return { value: 10 * this.i++, done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};

for (const value of iterable2) {
    console.log(value);
} // 10, 20, 30

要迭代除for...in之外的普通对象,我认为没问题,你可以使用Object.keys

const iterable = {1:10, 2:20, 3:30};
Object.keys( iterable ).forEach( key => {
    console.log( iterable[key] );
});  // 10, 20, 30

BTW你的第一个例子引发语法错误,也许你的意思是const iterable = [1,2,3]?然后它会起作用,因为Arrays是可迭代的对象。