Need Help Use the reduce Method to Analyze Data

Need Help Use the reduce Method to Analyze Data
0

#1
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/[email protected]@._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/[email protected]_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/[email protected]@._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/[email protected]@._V1_SX300.jpg",
                   "Metascore": "83",
                   "imdbRating": "7.9",
                   "imdbVotes": "876,575",
                   "imdbID": "tt0499549",
                   "Type": "movie",
                   "Response": "True"
                }
];

// Add your code below this line

var a=watchList.filter((i)=>i["Director"]=="Christopher Nolan");
var averageRating=a.reduce((ac,cv)=>((ac+parseFloat(cv.imdbRating))/(a.length),0));
// Add your code above this line

console.log(averageRating); 

Use the reduce Method to Analyze Data


#2

Add up the ratings then divide by the number of films once you have the result else you’ll get floating point errors.


#3

Javascript is notorious for have floating point imprecision/inaccuracy


#4

still its not working


#5

Can you post your updated code? It would help us see.


#6

Just post the function part and leave out the watchList array, to save space in the post.


#7
var a=watchList.filter((i)=>i["Director"]=="Christopher Nolan");
var b=a.reduce((ac,cv)=>(ac+parseFloat(cv.imdbRating)));
var averageRating=b/a.length;
console.log(averageRating);

#8

Okay. Looking at it more closely, the problem I find is that the reduce method is not going to function correctly. The reason is because the ac is not what you think. Remember that a is an array of objects. So what is ac going to be? It’s not going to be a number.

It would be best to slim down a even further and cut out what you don’t need from each element of a.


#9

The issue you have now is since you did not specify an initial value for ac, in the first iteration of the reduce, ac is the first object and cv is the second object. Your return statement attempts concatenates an object with a number and gets coerced into a string. This makes the value of b the string ‘[object Object]8.698.3’, so when you try to divided by a.length this returns NaN.

You need to add an initial value for the reduce’s accumulator argument to start with. Read the documentation for reduce if you do not know where to put the initial value for the accumulator.


#10

Or do what @RandellDawson says. His solution is like 2-3 additional chars.


#11

I tried first by giving initial value to 0 , but then also it didn’t worked


#12

I would need to see the code you tried.


#13

You did it before, but with all the inaccuracies of 4 instances of dividing, it may have given you an close, but inaccurate answer. Try it again with the latest code you have.


#14
var a=watchList.filter((i)=>i["Director"]=="Christopher Nolan");
var b=a.reduce((ac,cv)=>(ac+parseFloat(cv.imdbRating),0));
var averageRating=b/a.length;
console.log(averageRating);

#15

You put the , 0 in the wrong place. Move it one more closing parentheses to the right. This is a great lesson into why you should put more space in your code.

var b = a.reduce((ac,cv) => ac + parseFloat(cv.imdbRating), 0);

The above is much more readable. To make it even more readable, you should change your a and b variable names to reflect what they contain. For example, I would rename a to nolanMovies and b to nolanRatings. Also, I would rename ac to ratingsSum and cv to movie.


#16

Thanks very much , It worked now :slightly_smiling_face:


#17

I edited my last post to reflect my opinions about your variable naming convention.

Also, in the future when you post code to a forum post, please precede it with a line of three backticks and follow it with a line of three backticks to make easier to read. See this post to find the backtick on your keyboard. The “preformatted text” tool in the editor (</>) will also add backticks around text.