014. Zwykły obiekt '{}' nie implementuje interfejsu Iterable - jak sobie z tym radzić?

Iterowalne obiekty to takie, które implementują metodę @@iterator (dostępną jako [Symbol.iterator]).
Przykładami iterowalnych obiektów są:
    - Tablice (Array),
    - Mapy (Map),
    - Zbiory (Set),
    - Napis (String),
    - Obiekty generatorów.


Jak iterować po zwykłym obiekcie ({})?
    - korzystając z narzędzi takich jak Object.keys, Object.values, czy Object.entries

        const obj = { a: "b", c: "d" };
        for (const key of Object.keys(obj)) {
          console.log(key); // "a", "c"
        }

        const obj = { a: "b", c: "d" };
        for (const value of Object.values(obj)) {
          console.log(value); // "b", "d"
        }

        const obj = { a: "b", c: "d" };
        for (const [key, value] of Object.entries(obj)) {
          console.log(key, value); // "a b", "c d"
        }


Jak uczynić obiekt iterowalnym?
    Jeśli chcesz, aby obiekt zachowywał się jak iterowalny, możesz ręcznie zaimplementować metodę [Symbol.iterator]. Oto przykład:

    const obj = { a: "b", c: "d" };

    obj[Symbol.iterator] = function* () {
      for (const key of Object.keys(this)) {
        yield [key, this[key]]; // Zwracaj pary klucz-wartość
      }
    };

    const map = new Map(obj); // Teraz działa
    console.log(map); // Map(2) { 'a' => 'b', 'c' => 'd' }