How to use reduce parameters in Use the reduce Method to Analyze Data

Tell us what’s happening:
I’ve been working through the Javascript courses in order, and I’m a bit confused about how the reduce method actually works. I know my code is functional/passes the tests (although not the neatest), but I don’t completely understand how it’s actually working.

I know the first parameter in the reduce method is the accumulator - no issues there - but when the second parameter doesn’t directly reference a specific property, how does it know what to add up? I.e. in my code, it adds the ratings to the sum, but it doesn’t work if I name that second parameter “movie” and tell it to add “movie.imdbRating” to the sum. Why does that not work?

The examples given in the instructions on the left both reference specific properties in the reduce function (e.g.
const sumOfAges = users.reduce((sum, user) => sum + user.age, 0); ). When is that necessary, vs when should you just add the “currentValue” parameter?

I tried checking the FCC solutions but these ones don’t have any explanations with them, and I’ve read through the .reduce() documentation but I’m still pretty confused.

Your code so far


// The global variable
var watchList = [
  {
    "Title": "Inception",
    "Year": "2010",
    "Rated": "PG-13",
    "Released": "16 Jul 2010",
    "Runtime": "148 min",
    "Genre": "Action, Adventure, Crime",
    "Director": "Christopher Nolan",
    "Writer": "Christopher Nolan",
    "Actors": "Leonardo DiCaprio, Joseph Gordon-Levitt, Ellen Page, Tom Hardy",
    "Plot": "A thief, who steals corporate secrets through use of dream-sharing technology, is given the inverse task of planting an idea into the mind of a CEO.",
    "Language": "English, Japanese, French",
    "Country": "USA, UK",
    "Awards": "Won 4 Oscars. Another 143 wins & 198 nominations.",
    "Poster": "http://ia.media-imdb.com/images/M/MV5BMjAxMzY3NjcxNF5BMl5BanBnXkFtZTcwNTI5OTM0Mw@@._V1_SX300.jpg",
    "Metascore": "74",
    "imdbRating": "8.8",
    "imdbVotes": "1,446,708",
    "imdbID": "tt1375666",
    "Type": "movie",
    "Response": "True"
  },
  {
    "Title": "Interstellar",
    "Year": "2014",
    "Rated": "PG-13",
    "Released": "07 Nov 2014",
    "Runtime": "169 min",
    "Genre": "Adventure, Drama, Sci-Fi",
    "Director": "Christopher Nolan",
    "Writer": "Jonathan Nolan, Christopher Nolan",
    "Actors": "Ellen Burstyn, Matthew McConaughey, Mackenzie Foy, John Lithgow",
    "Plot": "A team of explorers travel through a wormhole in space in an attempt to ensure humanity's survival.",
    "Language": "English",
    "Country": "USA, UK",
    "Awards": "Won 1 Oscar. Another 39 wins & 132 nominations.",
    "Poster": "http://ia.media-imdb.com/images/M/MV5BMjIxNTU4MzY4MF5BMl5BanBnXkFtZTgwMzM4ODI3MjE@._V1_SX300.jpg",
    "Metascore": "74",
    "imdbRating": "8.6",
    "imdbVotes": "910,366",
    "imdbID": "tt0816692",
    "Type": "movie",
    "Response": "True"
  },
  {
    "Title": "The Dark Knight",
    "Year": "2008",
    "Rated": "PG-13",
    "Released": "18 Jul 2008",
    "Runtime": "152 min",
    "Genre": "Action, Adventure, Crime",
    "Director": "Christopher Nolan",
    "Writer": "Jonathan Nolan (screenplay), Christopher Nolan (screenplay), Christopher Nolan (story), David S. Goyer (story), Bob Kane (characters)",
    "Actors": "Christian Bale, Heath Ledger, Aaron Eckhart, Michael Caine",
    "Plot": "When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, the caped crusader must come to terms with one of the greatest psychological tests of his ability to fight injustice.",
    "Language": "English, Mandarin",
    "Country": "USA, UK",
    "Awards": "Won 2 Oscars. Another 146 wins & 142 nominations.",
    "Poster": "http://ia.media-imdb.com/images/M/MV5BMTMxNTMwODM0NF5BMl5BanBnXkFtZTcwODAyMTk2Mw@@._V1_SX300.jpg",
    "Metascore": "82",
    "imdbRating": "9.0",
    "imdbVotes": "1,652,832",
    "imdbID": "tt0468569",
    "Type": "movie",
    "Response": "True"
  },
  {
    "Title": "Batman Begins",
    "Year": "2005",
    "Rated": "PG-13",
    "Released": "15 Jun 2005",
    "Runtime": "140 min",
    "Genre": "Action, Adventure",
    "Director": "Christopher Nolan",
    "Writer": "Bob Kane (characters), David S. Goyer (story), Christopher Nolan (screenplay), David S. Goyer (screenplay)",
    "Actors": "Christian Bale, Michael Caine, Liam Neeson, Katie Holmes",
    "Plot": "After training with his mentor, Batman begins his fight to free crime-ridden Gotham City from the corruption that Scarecrow and the League of Shadows have cast upon it.",
    "Language": "English, Urdu, Mandarin",
    "Country": "USA, UK",
    "Awards": "Nominated for 1 Oscar. Another 15 wins & 66 nominations.",
    "Poster": "http://ia.media-imdb.com/images/M/MV5BNTM3OTc0MzM2OV5BMl5BanBnXkFtZTYwNzUwMTI3._V1_SX300.jpg",
    "Metascore": "70",
    "imdbRating": "8.3",
    "imdbVotes": "972,584",
    "imdbID": "tt0372784",
    "Type": "movie",
    "Response": "True"
  },
  {
    "Title": "Avatar",
    "Year": "2009",
    "Rated": "PG-13",
    "Released": "18 Dec 2009",
    "Runtime": "162 min",
    "Genre": "Action, Adventure, Fantasy",
    "Director": "James Cameron",
    "Writer": "James Cameron",
    "Actors": "Sam Worthington, Zoe Saldana, Sigourney Weaver, Stephen Lang",
    "Plot": "A paraplegic marine dispatched to the moon Pandora on a unique mission becomes torn between following his orders and protecting the world he feels is his home.",
    "Language": "English, Spanish",
    "Country": "USA, UK",
    "Awards": "Won 3 Oscars. Another 80 wins & 121 nominations.",
    "Poster": "http://ia.media-imdb.com/images/M/MV5BMTYwOTEwNjAzMl5BMl5BanBnXkFtZTcwODc5MTUwMw@@._V1_SX300.jpg",
    "Metascore": "83",
    "imdbRating": "7.9",
    "imdbVotes": "876,575",
    "imdbID": "tt0499549",
    "Type": "movie",
    "Response": "True"
  }
];

function getRating(watchList){
  // Only change code below this line
  let movies = watchList
  .filter(movie => movie['Director']=='Christopher Nolan')
  .map(movie => Number(movie['imdbRating'])
  );
  let averageRating = (movies.reduce((sum, rating)=>sum+rating))/(movies.length);


  // Only change code above this line
  return averageRating;
}
console.log(getRating(watchList));

Challenge: Use the reduce Method to Analyze Data

Link to the challenge:

You need to show your code, because the second parameter is the current item in the array, and the current item is one of those objects, and you can call that whatever you want, so movie.imdbRating should get that rating property. The way you describe it here is how it works, so I’m assuming there is an error somewhere in your code.

Hi, sorry the code is pretty long because I left the watchList array in for context. My code is just at the bottom of it. I’ve pasted it here to make it easier to find, sorry if I have the formatting wrong.

  // Only change code below this line
  let movies = watchList
  .filter(movie => movie['Director']=='Christopher Nolan')
  .map(movie => Number(movie['imdbRating'])
  );
  let averageRating = (movies.reduce((sum, rating)=>sum+rating))/(movies.length);


  // Only change code above this line
  return averageRating;
}
console.log(getRating(watchList));```

Edit: sorry you’re doing that already, 2 secs I’ll just check the code to see where the issue is

Sorry, I completely misread that!

I think you have an understanding that is completely correct here – the second parameter is the current item. As an example where I’ve accessed the properties using dot notation (which will produce exactly the same result as your code):

function getRating(watchList){
  const nolanMovies = watchList .filter(movie => movie.Director  === "Christopher Nolan");
  return nolanMovies.reduce((sum, movie) => sum + Number(movie.imdbRating), 0) / nolanMovies.length;
}

So I’m not quite sure why it isn’t working for you – if I change to using movie.Director and movie.imdbRating in your solution it works fine.

Thanks for the clarification and the extra example! Maybe I’ll fiddle around a bit to see if I can find why it didn’t work. It’s very helpful to know that I wasn’t totally misunderstanding how that method actually works!