DEV Community

Returning an object using reduce()

PJ Mantoss on March 06, 2020

Hi good people! I need help with some JavaScript challenge: QUESTION: Write a function called getSongCountByArtist which takes in an array of song...
Collapse
 
craigmc08 profile image
Craig McIlwrath

You're code is very close, but the function given to reduce should return an object. Instead of returning acc[val.artist] + songNo, you could increment acc[val.artist] by songNo and the return acc.

Although I'm not sure why you're adding the length of the song name. Maybe just increment by 1 each time?

Collapse
 
pjmantoss profile image
PJ Mantoss

Hi Craig! I have applied your suggestion. It's still not returning the right data. It returns an empty object. Please See below:

function getSongCountByArtist(arr){

return arr.reduce(function(acc,val){
    let artistName = val.artist,
        artistSong = val.name;

     arr[artistName] = artistSong;

    if(artistName){
        artistSong += 1;
    }

    return acc;

}, {})

}
//test
getSongCountByArtist(songs); // {}

Thank you

Collapse
 
craigmc08 profile image
Craig McIlwrath

Seems I didn't describe my idea very well. Here's the code I had in mind:

function getSongCountByArtist(songs) {
  return songs.reduce(function (acc, song) {
    if (acc[song.artist] === undefined) acc[song.artist] = 0;
    acc[song.artist]++;
    return acc;
  }, {});
} 
Thread Thread
 
pjmantoss profile image
PJ Mantoss

Hello Craig! I've implemented your code and it works perfectly now. Thanks a million! I appreciate your help.

Collapse
 
eddifd profile image
EddiFd

Do not use reduce.

Try :

Array.from(new Set(songs.map(e => e.artist).sort()).values()).map(e => {let obj = {}; obj[e] = songs.filter(f => f.artist == e).length; return obj;})