Reduce Method: NaN error

I don’t know why this code is returning NaN while it should return average of given array.

// 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”
}
];

// Add your code below this line

var averageRating = watchList.filter( (a) => a.Director === ‘Christopher Nolan’).reduce( (b,c) => {
let m = parseFloat(b.imdbRating);
let n = parseFloat(c.imdbRating);
return (m+n)/2;
})

// Add your code above this line

console.log(averageRating);

NaN means “not a number” therefore you are performing a mathematical operation on something that is not a number.
Simply add some if statements to check that you are touching a number and if not publish some kind of log or alert and you will find your issue.

I tried everything using console.log. It is a number in the middle of the function but when the value return to the variable suddenly it becomes NaN.

Add back your logs and paste your code here. I am interested to see how you tried to identify the issue.

// Add your code below this line
let cN = watchList.filter( (a) => a.Director === ‘Christopher Nolan’);

let avg = cN.reduce( (a,b) => {
let m = parseFloat(a.imdbRating);
console.log(m);
let n = parseFloat(b.imdbRating);
console.log(n);
let ans = (m + n)/2;
console.log(ans);
return ans;
})
var averageRating = avg;

// Add your code above this line

console.log(averageRating);

it shows NaN to return value only.

Here are the logs:

// running test
The averageRating should equal 8.675.
// tests completed
8.8
8.6
8.7
NaN
9
NaN
NaN
8.3
NaN
NaN

Hi @seinfeld70

I think you’re misunderstanding how reduce works.

On each iteration, the first argument (b in your case) to the function will be the accumulated value from each call on each element. The second argument (c in your case) is the next element in the array to perform the work on.

By default, the first call to reduce b is the first element in the array (you can pass a second argument to the reduce method, after the function, that will act as the first element).

So on the first call, b will be the first object in the array and c will be the second element. However, on the second call, b will be the result of the previous call, 8.7 in your case, so when you try and call the parseFloat method on that number, you get a NaN because it expects a string, not a number.

Have a look here for further information, you’ll likely need to use that default first parameter i mentioned to help solve this.

Put your log statement above the parse statements. Log each of a.imdbrating and b.imdbrating

Hello there, not sure why you are addressing me. I do not recall asking any questions…

Opps, my bad, should of checked the username before I submitted my post :blush:

1 Like

// Add your code below this line
let cN = watchList.filter( (a) => a.Director === ‘Christopher Nolan’);
let arr = […cN];
let rates = arr.map((a) => parseFloat(a.imdbRating));
var averageRating = rates.reduce( (a,b) => (a+b)/2);

// Add your code above this line

console.log(averageRating);

logs:
// running test
The averageRating should equal 8.675.
// tests completed

8.575

missed by 0.1 but why?

You’re using floats, and you’re getting floating point errors due to the division of floats at every step. Either use reduce to get a total (as ints, not floats), then divide the result of that by the number of items, or else round on every step of your current code (first option is much easier)