2016-12-16 36 views
7

Działa to dobrze dla mnie:Iterate nad obiektem w ES6

const iterable = [1, 2, 3]; 

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

Jednak to nie działa:

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

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

Zamiast dając mi błąd:

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

Jak powinien Robię to?

To jest to, co robię teraz:

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

Czy chodziło Ci o "za ... w"? I nie, pierwszy przykład też nie powinien "działać". – Bergi

+0

Nie powinieneś tego robić. Po prostu użyj pętli 'for ... in'. Nie potrzebujesz sprawdzenia '.hasOwnProperty', btw. – Bergi

Odpowiedz

8

for..of działa tylko dla iterable objects. Można zaimplementować iterację tak:

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 

iteracyjne nad prostych obiektów, inne niż for...in co moim zdaniem jest w porządku, można użyć Object.keys:

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

BTW Twój pierwszy przykład rzuca błąd składni , może miałeś na myśli const iterable = [1,2,3]? Wtedy zadziałałoby, ponieważ tablice są obiektami, które można analizować.

+5

Czuję kod górny jest 5 razy mniej czytelny –

+0

ya, że ​​kod straszny – vijay