346 lines
15 KiB
Markdown
346 lines
15 KiB
Markdown
---
|
||
id: 587d7da9367417b2b2512b68
|
||
title: Використовуйте метод reduce для аналізу даних
|
||
challengeType: 1
|
||
forumTopicId: 301313
|
||
dashedName: use-the-reduce-method-to-analyze-data
|
||
---
|
||
|
||
# --description--
|
||
|
||
`Array.prototype.reduce()` або просто `reduce()` - це найзагальніша з усіх операцій з масивами в JavaScript. Ви можете вирішити практично будь -яку проблему з обробкою масиву, використовуючи метод `reduce`.
|
||
|
||
Метод `reduce` дозволяє використовувати більш загальні форми обробки масивів, і можна показати, що і `filter`, і `map` можуть бути отримані як спеціальні програми `reduce`. Метод `reduce` перебирає кожен елемент у масиві та повертає єдине значення (тобто рядок, число, об’єкт, масив). Це досягається за допомогою функції зворотного виклику, яка відбувається на кожній ітерації.
|
||
|
||
Функція зворотного виклику приймає чотири аргументи. Перший аргумент відомий як акумулятор, якому призначається повернене значення функції зворотного виклику з попередньої ітерації, другий - поточний елемент, що обробляється, третій - індекс цього елемента, а четвертий - масив, < code>reduce</code> на який звернений виклик.
|
||
|
||
На додаток до функції зворотного виклику, `reduce` має додатковий параметр, який приймає початкове значення для підсумовуюючого регістру. Якщо цей другий параметр не використовується, то перша ітерація пропускається, а друга передається першому елементу масиву як акумулятору.
|
||
|
||
Нижче наведено приклад використання `reduce` у масиві `users`, щоб повернути суму всіх вікових категорій користувачів. Для простоти у прикладі використовуються лише перший і другий аргументи.
|
||
|
||
```js
|
||
const users = [
|
||
{ name: 'John', age: 34 },
|
||
{ name: 'Amy', age: 20 },
|
||
{ name: 'camperCat', age: 10 }
|
||
];
|
||
|
||
const sumOfAges = users.reduce((sum, user) => sum + user.age, 0);
|
||
console.log(sumOfAges);
|
||
```
|
||
|
||
На консолі відображатиметься значення `64`.
|
||
|
||
В іншому прикладі можна побачити, як об'єкт може бути повернутий, що містить імена користувачів, які становлять таку ж цінність як і властивості щодо їх віку.
|
||
|
||
```js
|
||
const users = [
|
||
{ name: 'John', age: 34 },
|
||
{ name: 'Amy', age: 20 },
|
||
{ name: 'camperCat', age: 10 }
|
||
];
|
||
|
||
const usersObj = users.reduce((obj, user) => {
|
||
obj[user.name] = user.age;
|
||
return obj;
|
||
}, {});
|
||
console.log(usersObj);
|
||
```
|
||
|
||
На консолі відображатиметься значення `{John: 34, Amy: 20, camperCat: 10}`.
|
||
|
||
# --instructions--
|
||
|
||
Змінна `watchList` містить масив об’єктів з інформацією щодо декількох фільмів. Використовуйте `reduce`, щоб знайти середній рейтинг IMDB фільмів режисера `Крістофера Нолана`. Пригадайте з попередніх проблем, як дані `filter` та `map` можуть витягнути те, що нам потрібно. Можливо, доведеться створити інші змінні та повернути середній рейтинг із функції `getRating`. Зверніть увагу, що рейтингові значення зберігаються як рядки в об’єкті і їх потрібно перетворити в числа перш ніж вони будуть використані в будь-яких математичних операціях.
|
||
|
||
# --hints--
|
||
|
||
Змінна `watchList` не повинна змінюватися.
|
||
|
||
```js
|
||
assert(
|
||
watchList[0].Title === 'Inception' && watchList[4].Director == 'James Cameron'
|
||
);
|
||
```
|
||
|
||
Ваш код повинен використовувати метод `reduce`.
|
||
|
||
```js
|
||
assert(code.match(/\.reduce/g));
|
||
```
|
||
|
||
`getRating(watchList)` має дорівнювати 8.675.
|
||
|
||
```js
|
||
assert(getRating(watchList) === 8.675);
|
||
```
|
||
|
||
Ваш код не повинен використовувати цикл `for`.
|
||
|
||
```js
|
||
assert(!code.match(/for\s*?\([\s\S]*?\)/g));
|
||
```
|
||
|
||
Ваш код повинен повернути правильний висновок після зміни об’єкта `watchList`.
|
||
|
||
```js
|
||
assert(getRating(watchList.filter((_, i) => i < 1 || i > 2)) === 8.55);
|
||
```
|
||
|
||
# --seed--
|
||
|
||
## --seed-contents--
|
||
|
||
```js
|
||
// The global variable
|
||
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 averageRating;
|
||
|
||
|
||
// Only change code above this line
|
||
return averageRating;
|
||
}
|
||
|
||
console.log(getRating(watchList));
|
||
```
|
||
|
||
# --solutions--
|
||
|
||
```js
|
||
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) {
|
||
let averageRating;
|
||
const rating = watchList
|
||
.filter(obj => obj.Director === "Christopher Nolan")
|
||
.map(obj => Number(obj.imdbRating));
|
||
averageRating = rating.reduce((accum, curr) => accum + curr)/rating.length;
|
||
return averageRating;
|
||
}
|
||
```
|