.map() return undefined

Maybe its wrong to do what am doing bellow but I don’t understand why.
In challenge Use the reduce Method to Analyze Data i tried first with map() to get back the rating of Christopher Nolan.


const 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, Elliot 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 nolanRatings = watchList.map(item => {

    if(item["Director"] === "Christopher Nolan"){ 

      console.log(item["Title"]);

      return parseFloat(item.imdbRating);

    }

  });

  console.log(nolanRatings);

}

The code above return and undefined at the last of nolanRatings array and I can’t understand why!

console:

Inception
Interstellar
The Dark Knight
Batman Begins
[ 8.8, 8.6, 9, 8.3, undefined ]

You’re not returning anything from your function, you’re just console logging the result

what you mean you are not returning.
If movie is “Christopher Nolan” movie is return the rating

if(item["Director"] === "Christopher Nolan"){ 

      console.log(item["Title"]);

      return parseFloat(item.imdbRating);

    }

Eventually I found out what happen. map() always return something. Its not like filter(). So the last movie of dataset above is directed from James Cameron. The other four at the beginning are directed from Nolan. Because of If() statement above return the ratings of Nolan movies but on James Cameron movie there is nothing to do and return the undefined

Edit: Better explanation bellow

Just to be clear, you have two problems here. First, your getRating function returns nothing.

Also, your callback to the map function is only returning something if there is a match. If it doesn’t match, you return nothing, which is the same as returning undefined.

Is map what you want here? That returns a new array of the same size, each element transformed. But you want a reduced array.

Pay attention to the title of the challenge: “Use the reduce Method to Analyze Data”

Read the instructions closely:

The reduce method allows for more general forms of array processing, and it’s possible to show that both filter and map can be derived as special applications of reduce .

So, yes, you could use filter (to reject values you don’t want) and map (to transform the elements). You would need both to solve this - you can’t do it with just map. But rather than do it in two steps, this challenge wants you to do it in one step, with reduce.

Use reduce to find the average IMDB rating of the movies directed by Christopher Nolan .

It reminds you that you previously learned about map and filter, but it wants you to solve it with reduce.

reduce is confusing when you’re learning, but it also very powerful once you master it. In some ways it is the most powerful - you can do all the other methods with it and do combinations of their effects.

I knew it was wrong from the very beginning but I wanted to understand why. You gave me the perfect explanation. Thanks !

Side note - both map and filter return things and require callbacks that return things

1 Like

This topic was automatically closed 182 days after the last reply. New replies are no longer allowed.