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