Ecmascript 6 在es6中迭代对象

Ecmascript 6 在es6中迭代对象,ecmascript-6,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]); } 而是给我一个错误: Un

这对我来说很好:

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]);
    }
}

for..of
仅适用于。您可以实现如下迭代器:

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

顺便说一句,您的第一个示例抛出了一个语法错误,您的意思可能是
const iterable=[1,2,3]
?那么它就可以工作了,因为数组是可编辑的对象。

你的意思是
中的
吗?不,第一个例子也不应该“起作用”,你不应该这样做。只需在
循环中为…使用一个
。顺便说一句,您不需要检查
.hasOwnProperty
属性。在第二个示例中,我觉得顶级代码的可读性要低5倍,如果您不关心
iterable
的键(1、2、3),而只关心它的值(10、20、30),您可以编写
对象.values(iterable).forEach(value=>console.log(value))@robinmetral很好。我想在写这个答案时,
Object.values
并没有像现在这样得到广泛的支持。@pawel是的,
Object.values()
有点新。只是提到它,让今天的读者知道还有另一种方式:)
const iterable = {1:10, 2:20, 3:30};
Object.keys( iterable ).forEach( key => {
    console.log( iterable[key] );
});  // 10, 20, 30