2016-12-16 28 views
7

này hoạt động tốt đối với tôi:lặp trên một đối tượng trong es6

const iterable = [1, 2, 3]; 

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

Tuy nhiên điều này không làm việc:

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

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

Thay vì đem lại cho tôi những lỗi:

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

Làm thế nào nên Tôi đang làm điều này?

Đây là những gì tôi làm bây giờ:

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

Ý của bạn là 'for… in'? Và không, ví dụ đầu tiên cũng không nên "hoạt động". – Bergi

+0

Bạn không nên làm điều này. Chỉ cần sử dụng một vòng lặp 'for… in'. Bạn không cần kiểm tra '.hasOwnProperty', btw. – Bergi

Trả lời

8

for..of chỉ hoạt động cho iterable objects. Bạn có thể thực hiện một iterator như thế này:

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 

Để lặp qua các đối tượng đơn giản, trừ for...in mà tôi nghĩ là tốt, bạn có thể sử dụng Object.keys:

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

BTW ví dụ đầu tiên của bạn ném một lỗi cú pháp , có thể bạn có nghĩa là const iterable = [1,2,3]? Sau đó nó sẽ hoạt động vì các mảng là các đối tượng có thể lặp lại được.

+5

tôi cảm thấy mã hàng đầu là 5x ít có thể đọc được –

+0

ya mã đó đáng sợ – vijay

Các vấn đề liên quan