Что изменить в коде, чтобы я мог перебрать объекты внутри массива и вывести все
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})`);
}