Что изменить в коде, чтобы я мог перебрать объекты внутри массива и вывести все

const musicCollection = {
  albums: [{
      title: "Amends",
      artist: "Grey Daze",
      year: "2020"
    },
    {
      title: "Here on Earth",
      artist: "Tim McGraw",
      year: "2020"
    },
    {
      title: "Orquídeas",
      artist: "Karly Loaiza",
      year: "2024"
    }
  ]
}

musicCollection[Symbol.iterator] = function() {
  return {
    current: 0,
    to: this.albums.length,
    next() {
      return this.current < this.to ? {
        done: false,
        value: musicCollection[this.current++]
      } : {
        done: true
      };
    }
  }
}

for (let album of musicCollection) {
  console.log(`${album.title} - ${album.artist} (${album.year})`);
}


Ответы (1 шт):

Автор решения: Grundy

musicCollection в строке

musicCollection[this.current++]

это объект и у него нет целочисленных полей, однако есть поле albums, у которого они есть.

Поэтому для исправления достаточно заменить приведенную выше строку на следующую

musicCollection.albums[this.current++]

const musicCollection = {
  albums: [{
      title: "Amends",
      artist: "Grey Daze",
      year: "2020"
    },
    {
      title: "Here on Earth",
      artist: "Tim McGraw",
      year: "2020"
    },
    {
      title: "Orquídeas",
      artist: "Karly Loaiza",
      year: "2024"
    }
  ]
}

musicCollection[Symbol.iterator] = function() {
  return {
    current: 0,
    to: this.albums.length,
    next() {
      return this.current < this.to ? {
        done: false,
        value: musicCollection.albums[this.current++]
      } : {
        done: true
      };
    }
  }
}

for (let album of musicCollection) {
  console.log(`${album.title} - ${album.artist} (${album.year})`);
}

Для использования итераторов в некоторых случаях проще использовать функции генераторы

const musicCollection = {
  albums: [{
      title: "Amends",
      artist: "Grey Daze",
      year: "2020"
    },
    {
      title: "Here on Earth",
      artist: "Tim McGraw",
      year: "2020"
    },
    {
      title: "Orquídeas",
      artist: "Karly Loaiza",
      year: "2024"
    }
  ]
}

musicCollection[Symbol.iterator] = function* (){
  for(var i=0; i<this.albums.length; i++){
    yield this.albums[i];
  }
}

for (let album of musicCollection) {
  console.log(`${album.title} - ${album.artist} (${album.year})`);
}

Так как в данном случае функционал итератора совпадает с известным итератором массива, можно воспользоваться им напрямую:

const musicCollection = {
  albums: [{
      title: "Amends",
      artist: "Grey Daze",
      year: "2020"
    },
    {
      title: "Here on Earth",
      artist: "Tim McGraw",
      year: "2020"
    },
    {
      title: "Orquídeas",
      artist: "Karly Loaiza",
      year: "2024"
    }
  ]
}

musicCollection[Symbol.iterator] = musicCollection.albums[Symbol.iterator].bind(musicCollection.albums);

for (let album of musicCollection) {
  console.log(`${album.title} - ${album.artist} (${album.year})`);
}

→ Ссылка