fix(curriculum): fix challenges for russian language

This commit is contained in:
Valeriy S
2019-08-28 16:26:13 +03:00
committed by mrugesh
parent a17c3c44aa
commit 12f65a6742
1418 changed files with 39634 additions and 19395 deletions

View File

@ -2,31 +2,35 @@
id: 587d7da9367417b2b2512b67
title: Add Elements to the End of an Array Using concat Instead of push
challengeType: 1
videoUrl: ''
forumTopicId: 301226
localeTitle: Добавление элементов в конец массива используя concat вместо push
---
## Описание
<section id="description"> Функциональное программирование - это создание и использование не мутирующих функций. Предыдущая проблема ввела метод <code>concat</code> как способ объединить массивы, не изменяя исходные. Сравните <code>concat</code> с методом <code>push</code> . <code>Push</code> добавляет элемент в конец того же самого массива, на котором он вызывается, изменяя этот массив. Вот пример: <blockquote> var arr = [1, 2, 3]; <br> arr.push ([4, 5, 6]); <br> // arr изменяется на [1, 2, 3, [4, 5, 6]] <br> // Не функциональный способ программирования </blockquote> <code>Concat</code> предлагает способ добавления новых элементов в конец массива без каких-либо мутирующих побочных эффектов. </section>
## Description
<section id='description'>
Функциональное программирование - это создание и использование не мутирующих функций. Предыдущая проблема ввела метод <code>concat</code> как способ объединить массивы, не изменяя исходные. Сравните <code>concat</code> с методом <code>push</code> . <code>Push</code> добавляет элемент в конец того же самого массива, на котором он вызывается, изменяя этот массив. Вот пример: <blockquote> var arr = [1, 2, 3]; <br> arr.push ([4, 5, 6]); <br> // arr изменяется на [1, 2, 3, [4, 5, 6]] <br> // Не функциональный способ программирования </blockquote> <code>Concat</code> предлагает способ добавления новых элементов в конец массива без каких-либо мутирующих побочных эффектов.
</section>
## Указания
<section id="instructions"> Измените функцию <code>nonMutatingPush</code> чтобы она использовала <code>concat</code> для добавления <code>newItem</code> в конец <code>original</code> вместо <code>push</code> . Функция должна возвращать массив. </section>
## Instructions
<section id='instructions'>
Измените функцию <code>nonMutatingPush</code> чтобы она использовала <code>concat</code> для добавления <code>newItem</code> в конец <code>original</code> вместо <code>push</code> . Функция должна возвращать массив.
</section>
## Тесты
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>concat</code> .
testString: 'assert(code.match(/\.concat/g), "Your code should use the <code>concat</code> method.");'
- text: Ваш код не должен использовать метод <code>push</code> .
testString: 'assert(!code.match(/\.push/g), "Your code should not use the <code>push</code> method.");'
- text: <code>first</code> массив не должен меняться.
testString: 'assert(JSON.stringify(first) === JSON.stringify([1, 2, 3]), "The <code>first</code> array should not change.");'
- text: <code>second</code> массив не должен меняться.
testString: 'assert(JSON.stringify(second) === JSON.stringify([4, 5]), "The <code>second</code> array should not change.");'
- text: '<code>nonMutatingPush([1, 2, 3], [4, 5])</code> должен возвращать <code>[1, 2, 3, 4, 5]</code> .'
testString: 'assert(JSON.stringify(nonMutatingPush([1, 2, 3], [4, 5])) === JSON.stringify([1, 2, 3, 4, 5]), "<code>nonMutatingPush([1, 2, 3], [4, 5])</code> should return <code>[1, 2, 3, 4, 5]</code>.");'
- text: Your code should use the <code>concat</code> method.
testString: assert(code.match(/\.concat/g));
- text: Your code should not use the <code>push</code> method.
testString: assert(!code.match(/\.push/g));
- text: The <code>first</code> array should not change.
testString: assert(JSON.stringify(first) === JSON.stringify([1, 2, 3]));
- text: The <code>second</code> array should not change.
testString: assert(JSON.stringify(second) === JSON.stringify([4, 5]));
- text: <code>nonMutatingPush([1, 2, 3], [4, 5])</code> should return <code>[1, 2, 3, 4, 5]</code>.
testString: assert(JSON.stringify(nonMutatingPush([1, 2, 3], [4, 5])) === JSON.stringify([1, 2, 3, 4, 5]));
```
@ -52,14 +56,18 @@ nonMutatingPush(first, second);
</div>
</section>
## Решение
## Solution
<section id='solution'>
```js
// solution required
function nonMutatingPush(original, newItem) {
return original.concat(newItem);
}
var first = [1, 2, 3];
var second = [4, 5];
nonMutatingPush(first, second);
```
</section>

View File

@ -2,33 +2,37 @@
id: 587d7dab367417b2b2512b6d
title: Apply Functional Programming to Convert Strings to URL Slugs
challengeType: 1
videoUrl: ''
forumTopicId: 301227
localeTitle: Применить функциональное программирование для преобразования строк в URL-адреса
---
## Description
<section id="description"> Последние несколько проблем охватывали ряд полезных методов массивов и строк, которые следуют принципам функционального программирования. Мы также узнали о <code>reduce</code> , который является мощным методом, используемым для уменьшения проблем в более простых формах. От вычисления средних значений до сортировки любая операция массива может быть достигнута путем ее применения. Напомним, что <code>map</code> и <code>filter</code> являются особыми случаями <code>reduce</code> . Давайте объединим то, что мы узнали, чтобы решить практическую проблему. На многих сайтах управления контентом (CMS) заголовки сообщения добавлены в часть URL для простых целей закладок. Например, если вы пишете средний пост под названием «Stop Using Reduce», вероятно, URL-адрес будет иметь в нем какую-то форму заголовка («... / stop-using-reduce»). Возможно, вы уже это заметили на сайте freeCodeCamp. </section>
<section id='description'>
Последние несколько проблем охватывали ряд полезных методов массивов и строк, которые следуют принципам функционального программирования. Мы также узнали о <code>reduce</code> , который является мощным методом, используемым для уменьшения проблем в более простых формах. От вычисления средних значений до сортировки любая операция массива может быть достигнута путем ее применения. Напомним, что <code>map</code> и <code>filter</code> являются особыми случаями <code>reduce</code> . Давайте объединим то, что мы узнали, чтобы решить практическую проблему. На многих сайтах управления контентом (CMS) заголовки сообщения добавлены в часть URL для простых целей закладок. Например, если вы пишете средний пост под названием «Stop Using Reduce», вероятно, URL-адрес будет иметь в нем какую-то форму заголовка («... / stop-using-reduce»). Возможно, вы уже это заметили на сайте freeCodeCamp.
</section>
## Instructions
<section id="instructions"> Заполните функцию <code>urlSlug</code> чтобы она преобразует <code>title</code> строки и возвращает переносимую версию для URL-адреса. Вы можете использовать любой из методов, описанных в этом разделе, и не использовать <code>replace</code> . Вот требования: Вход представляет собой строку с пробелами и заглавными словами. Вывод представляет собой строку с пробелами между словами, замененными дефис ( <code>-</code> ). Вывод должен быть все буквы с нижним окошком. На выходе не должно быть пробелов </section>
<section id='instructions'>
Заполните функцию <code>urlSlug</code> чтобы она преобразует <code>title</code> строки и возвращает переносимую версию для URL-адреса. Вы можете использовать любой из методов, описанных в этом разделе, и не использовать <code>replace</code> . Вот требования: Вход представляет собой строку с пробелами и заглавными словами. Вывод представляет собой строку с пробелами между словами, замененными дефис ( <code>-</code> ). Вывод должен быть все буквы с нижним окошком. На выходе не должно быть пробелов
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Переменная <code>globalTitle</code> не должна изменяться.
testString: 'assert(globalTitle === "Winter Is Coming", "The <code>globalTitle</code> variable should not change.");'
- text: Ваш код не должен использовать метод <code>replace</code> для этой задачи.
testString: 'assert(!code.match(/\.replace/g), "Your code should not use the <code>replace</code> method for this challenge.");'
- text: <code>urlSlug(&quot;Winter Is Coming&quot;)</code> должен вернуться <code>&quot;winter-is-coming&quot;</code> .
testString: 'assert(urlSlug("Winter Is Coming") === "winter-is-coming", "<code>urlSlug("Winter Is Coming")</code> should return <code>"winter-is-coming"</code>.");'
- text: <code>urlSlug(&quot; Winter Is Coming&quot;)</code> должен вернуться <code>&quot;winter-is-coming&quot;</code> .
testString: 'assert(urlSlug(" Winter Is Coming") === "winter-is-coming", "<code>urlSlug(" Winter Is &nbsp;Coming")</code> should return <code>"winter-is-coming"</code>.");'
- text: <code>urlSlug(&quot;A Mind Needs Books Like A Sword Needs A Whetstone&quot;)</code> должен вернуть <code>&quot;a-mind-needs-books-like-a-sword-needs-a-whetstone&quot;</code> .
testString: 'assert(urlSlug("A Mind Needs Books Like A Sword Needs A Whetstone") === "a-mind-needs-books-like-a-sword-needs-a-whetstone", "<code>urlSlug("A Mind Needs Books Like A Sword Needs A Whetstone")</code> should return <code>"a-mind-needs-books-like-a-sword-needs-a-whetstone"</code>.");'
- text: <code>urlSlug(&quot;Hold The Door&quot;)</code> должен вернуть <code>&quot;hold-the-door&quot;</code> .
testString: 'assert(urlSlug("Hold The Door") === "hold-the-door", "<code>urlSlug("Hold The Door")</code> should return <code>"hold-the-door"</code>.");'
- text: The <code>globalTitle</code> variable should not change.
testString: assert(globalTitle === "Winter Is Coming");
- text: Your code should not use the <code>replace</code> method for this challenge.
testString: assert(!code.match(/\.replace/g));
- text: <code>urlSlug("Winter Is Coming")</code> should return <code>"winter-is-coming"</code>.
testString: assert(urlSlug("Winter Is Coming") === "winter-is-coming");
- text: <code>urlSlug(" Winter Is &nbsp;Coming")</code> should return <code>"winter-is-coming"</code>.
testString: assert(urlSlug(" Winter Is Coming") === "winter-is-coming");
- text: <code>urlSlug("A Mind Needs Books Like A Sword Needs A Whetstone")</code> should return <code>"a-mind-needs-books-like-a-sword-needs-a-whetstone"</code>.
testString: assert(urlSlug("A Mind Needs Books Like A Sword Needs A Whetstone") === "a-mind-needs-books-like-a-sword-needs-a-whetstone");
- text: <code>urlSlug("Hold The Door")</code> should return <code>"hold-the-door"</code>.
testString: assert(urlSlug("Hold The Door") === "hold-the-door");
```
@ -56,14 +60,22 @@ var winterComing = urlSlug(globalTitle); // Should be "winter-is-coming"
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
// the global variable
var globalTitle = "Winter Is Coming";
// Add your code below this line
function urlSlug(title) {
return title.trim().split(/\s+/).join("-").toLowerCase();
}
// Add your code above this line
var winterComing = urlSlug(globalTitle); // Should be "winter-is-coming"
```
</section>

View File

@ -2,25 +2,29 @@
id: 587d7b8e367417b2b2512b5e
title: Avoid Mutations and Side Effects Using Functional Programming
challengeType: 1
videoUrl: ''
forumTopicId: 301228
localeTitle: Избегайте мутаций и побочных эффектов с помощью функционального программирования
---
## Description
<section id="description"> Если вы еще этого не поняли, проблема в предыдущем вызове заключалась в вызове <code>splice</code> в функции <code>tabClose()</code> . К сожалению, <code>splice</code> изменяет исходный массив, на который он вызывается, поэтому второй вызов к нему использовал модифицированный массив и дал неожиданные результаты. Это небольшой пример гораздо большего шаблона - вы вызываете функцию в переменной, массиве или объекте, а функция меняет переменную или что-то в объекте. Одним из основных принципов функционального программирования является не изменение вещей. Изменения приводят к ошибкам. Легче предотвращать ошибки, зная, что ваши функции ничего не меняют, включая аргументы функции или любую глобальную переменную. В предыдущем примере не было никаких сложных операций, но метод <code>splice</code> изменил исходный массив и привел к ошибке. Напомним, что в функциональном программировании изменение или изменение вещей называется <code>mutation</code> , и результат называется <code>side effect</code> . Функция, в идеале, должна быть <code>pure function</code> , что означает, что она не вызывает никаких побочных эффектов. Давайте попробуем освоить эту дисциплину, а не изменять любую переменную или объект в нашем коде. </section>
<section id='description'>
Если вы еще этого не поняли, проблема в предыдущем вызове заключалась в вызове <code>splice</code> в функции <code>tabClose()</code> . К сожалению, <code>splice</code> изменяет исходный массив, на который он вызывается, поэтому второй вызов к нему использовал модифицированный массив и дал неожиданные результаты. Это небольшой пример гораздо большего шаблона - вы вызываете функцию в переменной, массиве или объекте, а функция меняет переменную или что-то в объекте. Одним из основных принципов функционального программирования является не изменение вещей. Изменения приводят к ошибкам. Легче предотвращать ошибки, зная, что ваши функции ничего не меняют, включая аргументы функции или любую глобальную переменную. В предыдущем примере не было никаких сложных операций, но метод <code>splice</code> изменил исходный массив и привел к ошибке. Напомним, что в функциональном программировании изменение или изменение вещей называется <code>mutation</code> , и результат называется <code>side effect</code> . Функция, в идеале, должна быть <code>pure function</code> , что означает, что она не вызывает никаких побочных эффектов. Давайте попробуем освоить эту дисциплину, а не изменять любую переменную или объект в нашем коде.
</section>
## Instructions
<section id="instructions"> Заполните код для <code>incrementer</code> функции, чтобы он возвращал значение глобальной переменной <code>fixedValue</code> увеличиваемое на единицу. </section>
<section id='instructions'>
Заполните код для <code>incrementer</code> функции, чтобы он возвращал значение глобальной переменной <code>fixedValue</code> увеличиваемое на единицу.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш <code>incrementer</code> функции не должен изменять значение <code>fixedValue</code> .
testString: 'assert(fixedValue === 4, "Your function <code>incrementer</code> should not change the value of <code>fixedValue</code>.");'
- text: 'Функция <code>incrementer</code> должна возвращать значение, которое больше значения <code>fixedValue</code> .'
testString: 'assert(newValue === 5, "Your <code>incrementer</code> function should return a value that is one larger than the <code>fixedValue</code> value.");'
- text: Your function <code>incrementer</code> should not change the value of <code>fixedValue</code>.
testString: assert(fixedValue === 4);
- text: Your <code>incrementer</code> function should return a value that is one larger than the <code>fixedValue</code> value.
testString: assert(newValue === 5);
```
@ -49,14 +53,19 @@ console.log(fixedValue); // Should print 4
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
var fixedValue = 4
function incrementer() {
return fixedValue + 1
}
var newValue = incrementer(); // Should equal 5
```
</section>

View File

@ -2,33 +2,37 @@
id: 587d7daa367417b2b2512b6c
title: Combine an Array into a String Using the join Method
challengeType: 1
videoUrl: ''
forumTopicId: 18221
localeTitle: Объединение массива в строку Использование метода объединения
---
## Description
<section id="description"> Метод <code>join</code> используется для объединения элементов массива вместе для создания строки. Он принимает аргумент для разделителя, который используется для разделения элементов массива в строке. Вот пример: <blockquote> var arr = [&quot;Hello&quot;, &quot;World&quot;]; <br> var str = arr.join (&quot;&quot;); <br> // Устанавливает str для «Hello World» </blockquote></section>
<section id='description'>
Метод <code>join</code> используется для объединения элементов массива вместе для создания строки. Он принимает аргумент для разделителя, который используется для разделения элементов массива в строке. Вот пример: <blockquote> var arr = [&quot;Hello&quot;, &quot;World&quot;]; <br> var str = arr.join (&quot;&quot;); <br> // Устанавливает str для «Hello World» </blockquote>
</section>
## Instructions
<section id="instructions"> Используйте метод <code>join</code> (среди других) внутри функции <code>sentensify</code> чтобы сделать предложение из слов в строке <code>str</code> . Функция должна возвращать строку. Например, «I-like-Star-Wars» будет преобразован в «Мне нравятся« Звездные войны ». Для этой задачи не используйте метод <code>replace</code> . </section>
<section id='instructions'>
Используйте метод <code>join</code> (среди других) внутри функции <code>sentensify</code> чтобы сделать предложение из слов в строке <code>str</code> . Функция должна возвращать строку. Например, «I-like-Star-Wars» будет преобразован в «Мне нравятся« Звездные войны ». Для этой задачи не используйте метод <code>replace</code> .
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>join</code> .
testString: 'assert(code.match(/\.join/g), "Your code should use the <code>join</code> method.");'
- text: Ваш код не должен использовать метод <code>replace</code> .
testString: 'assert(!code.match(/\.replace/g), "Your code should not use the <code>replace</code> method.");'
- text: <code>sentensify(&quot;May-the-force-be-with-you&quot;)</code> должен возвращать строку.
testString: 'assert(typeof sentensify("May-the-force-be-with-you") === "string", "<code>sentensify("May-the-force-be-with-you")</code> should return a string.");'
- text: <code>sentensify(&quot;May-the-force-be-with-you&quot;)</code> должна вернуться <code>&quot;May the force be with you&quot;</code> .
testString: 'assert(sentensify("May-the-force-be-with-you") === "May the force be with you", "<code>sentensify("May-the-force-be-with-you")</code> should return <code>"May the force be with you"</code>.");'
- text: <code>sentensify(&quot;The.force.is.strong.with.this.one&quot;)</code> должен вернуться <code>&quot;The force is strong with this one&quot;</code> .
testString: 'assert(sentensify("The.force.is.strong.with.this.one") === "The force is strong with this one", "<code>sentensify("The.force.is.strong.with.this.one")</code> should return <code>"The force is strong with this one"</code>.");'
- text: '<code>sentensify(&quot;There,has,been,an,awakening&quot;)</code> должен вернуться <code>&quot;There has been an awakening&quot;</code> .'
testString: 'assert(sentensify("There,has,been,an,awakening") === "There has been an awakening", "<code>sentensify("There,has,been,an,awakening")</code> should return <code>"There has been an awakening"</code>.");'
- text: Your code should use the <code>join</code> method.
testString: assert(code.match(/\.join/g));
- text: Your code should not use the <code>replace</code> method.
testString: assert(!code.match(/\.replace/g));
- text: <code>sentensify("May-the-force-be-with-you")</code> should return a string.
testString: assert(typeof sentensify("May-the-force-be-with-you") === "string");
- text: <code>sentensify("May-the-force-be-with-you")</code> should return <code>"May the force be with you"</code>.
testString: assert(sentensify("May-the-force-be-with-you") === "May the force be with you");
- text: <code>sentensify("The.force.is.strong.with.this.one")</code> should return <code>"The force is strong with this one"</code>.
testString: assert(sentensify("The.force.is.strong.with.this.one") === "The force is strong with this one");
- text: <code>sentensify("There,has,been,an,awakening")</code> should return <code>"There has been an awakening"</code>.
testString: assert(sentensify("There,has,been,an,awakening") === "There has been an awakening");
```
@ -52,14 +56,17 @@ sentensify("May-the-force-be-with-you");
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
function sentensify(str) {
// Add your code below this line
return str.split(/\W/).join(' ');
// Add your code above this line
}
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7da9367417b2b2512b66
title: Combine Two Arrays Using the concat Method
challengeType: 1
videoUrl: ''
forumTopicId: 301229
localeTitle: Объединить два массива с помощью метода concat
---
## Description
<section id="description"> <code>Concatenation</code> означает объединение объектов до конца. JavaScript предлагает метод <code>concat</code> для строк и массивов, которые работают одинаково. Для массивов метод вызывается на один, затем другой массив предоставляется как аргумент <code>concat</code> , который добавляется в конец первого массива. Он возвращает новый массив и не мутирует ни один из исходных массивов. Вот пример: <blockquote> [1, 2, 3] .concat ([4, 5, 6]); <br> // Возвращает новый массив [1, 2, 3, 4, 5, 6] </blockquote></section>
<section id='description'>
<code>Concatenation</code> означает объединение объектов до конца. JavaScript предлагает метод <code>concat</code> для строк и массивов, которые работают одинаково. Для массивов метод вызывается на один, затем другой массив предоставляется как аргумент <code>concat</code> , который добавляется в конец первого массива. Он возвращает новый массив и не мутирует ни один из исходных массивов. Вот пример: <blockquote> [1, 2, 3] .concat ([4, 5, 6]); <br> // Возвращает новый массив [1, 2, 3, 4, 5, 6] </blockquote>
</section>
## Instructions
<section id="instructions"> Используйте <code>concat</code> метод в <code>nonMutatingConcat</code> функции конкатенации <code>attach</code> к концу <code>original</code> . Функция должна возвращать конкатенированный массив. </section>
<section id='instructions'>
Используйте <code>concat</code> метод в <code>nonMutatingConcat</code> функции конкатенации <code>attach</code> к концу <code>original</code> . Функция должна возвращать конкатенированный массив.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>concat</code> .
testString: 'assert(code.match(/\.concat/g), "Your code should use the <code>concat</code> method.");'
- text: <code>first</code> массив не должен меняться.
testString: 'assert(JSON.stringify(first) === JSON.stringify([1, 2, 3]), "The <code>first</code> array should not change.");'
- text: <code>second</code> массив не должен меняться.
testString: 'assert(JSON.stringify(second) === JSON.stringify([4, 5]), "The <code>second</code> array should not change.");'
- text: '<code>nonMutatingConcat([1, 2, 3], [4, 5])</code> должен возвращать <code>[1, 2, 3, 4, 5]</code> .'
testString: 'assert(JSON.stringify(nonMutatingConcat([1, 2, 3], [4, 5])) === JSON.stringify([1, 2, 3, 4, 5]), "<code>nonMutatingConcat([1, 2, 3], [4, 5])</code> should return <code>[1, 2, 3, 4, 5]</code>.");'
- text: Your code should use the <code>concat</code> method.
testString: assert(code.match(/\.concat/g));
- text: The <code>first</code> array should not change.
testString: assert(JSON.stringify(first) === JSON.stringify([1, 2, 3]));
- text: The <code>second</code> array should not change.
testString: assert(JSON.stringify(second) === JSON.stringify([4, 5]));
- text: <code>nonMutatingConcat([1, 2, 3], [4, 5])</code> should return <code>[1, 2, 3, 4, 5]</code>.
testString: assert(JSON.stringify(nonMutatingConcat([1, 2, 3], [4, 5])) === JSON.stringify([1, 2, 3, 4, 5]));
```
@ -50,14 +54,20 @@ nonMutatingConcat(first, second);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
function nonMutatingConcat(original, attach) {
// Add your code below this line
return original.concat(attach);
// Add your code above this line
}
var first = [1, 2, 3];
var second = [4, 5];
nonMutatingConcat(first, second);
```
</section>

View File

@ -2,31 +2,35 @@
id: 587d7b8f367417b2b2512b62
title: Implement map on a Prototype
challengeType: 1
videoUrl: ''
forumTopicId: 301230
localeTitle: Реализовать map на прототипе
---
## Описание
<section id="description"> Как вы видели из применения <code>Array.prototype.map()</code> или просто <code>map()</code> ранее, метод <code>map</code> возвращает массив той же длины, что и тот, на котором он был вызван. Он также не изменяет исходный массив, если его функция обратного вызова не отработает. Другими словами, <code>map</code> является чистой функцией, и результат еевыполнения зависит исключительно от ее аргументов. Кроме того, в качестве аргумента требуется другая функция. Это достаточно описало <code>map</code> чтобы попытаться реализовать версию, которая ведет себя точно так же, как <code>Array.prototype.map()</code> с помощью цикла <code>for</code> или <code>Array.prototype.forEach()</code> . Примечание. Чистая функция позволяет изменять локальные переменные, определенные в пределах ее области действия, хотя предпочтительно избегать этого. </section>
## Description
<section id='description'>
Как вы видели из применения <code>Array.prototype.map()</code> или просто <code>map()</code> ранее, метод <code>map</code> возвращает массив той же длины, что и тот, на котором он был вызван. Он также не изменяет исходный массив, если его функция обратного вызова не отработает. Другими словами, <code>map</code> является чистой функцией, и результат еевыполнения зависит исключительно от ее аргументов. Кроме того, в качестве аргумента требуется другая функция. Это достаточно описало <code>map</code> чтобы попытаться реализовать версию, которая ведет себя точно так же, как <code>Array.prototype.map()</code> с помощью цикла <code>for</code> или <code>Array.prototype.forEach()</code> . Примечание. Чистая функция позволяет изменять локальные переменные, определенные в пределах ее области действия, хотя предпочтительно избегать этого.
</section>
## Указания
<section id="instructions"> Напишите свой собственный <code>Array.prototype.myMap()</code> , который должен вести себя точно так же, как <code>Array.prototype.map()</code> . Вы можете использовать цикл <code>for</code> или метод <code>forEach</code> . </section>
## Instructions
<section id='instructions'>
Напишите свой собственный <code>Array.prototype.myMap()</code> , который должен вести себя точно так же, как <code>Array.prototype.map()</code> . Вы можете использовать цикл <code>for</code> или метод <code>forEach</code> .
</section>
## Тесты
## Tests
<section id='tests'>
```yml
tests:
- text: '<code>new_s</code> должен быть равен <code>[46, 130, 196, 10]</code> .'
testString: 'assert(JSON.stringify(new_s) === JSON.stringify([46, 130, 196, 10]), "<code>new_s</code> should equal <code>[46, 130, 196, 10]</code>.");'
- text: Ваш код не должен использовать метод <code>map</code> .
testString: 'assert(!code.match(/\.map/g), "Your code should not use the <code>map</code> method.");'
- text: <code>new_s</code> should equal <code>[46, 130, 196, 10]</code>.
testString: assert(JSON.stringify(new_s) === JSON.stringify([46, 130, 196, 10]));
- text: Your code should not use the <code>map</code> method.
testString: assert(!code.match(/\.map/g));
```
</section>
## Исходные данные
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
@ -52,14 +56,29 @@ var new_s = s.myMap(function(item){
</div>
</section>
## Решение
## Solution
<section id='solution'>
```js
// solution required
// the global Array
var s = [23, 65, 98, 5];
Array.prototype.myMap = function(callback){
var newArray = [];
// Add your code below this line
for (var elem of this) {
newArray.push(callback(elem));
}
// Add your code above this line
return newArray;
};
var new_s = s.myMap(function(item){
return item * 2;
});
```
</section>

View File

@ -2,31 +2,35 @@
id: 587d7b8f367417b2b2512b64
title: Implement the filter Method on a Prototype
challengeType: 1
videoUrl: ''
forumTopicId: 301231
localeTitle: Реализовать filter на прототипе
---
## Описание
<section id="description"> Реализация версии <code>filter</code>, которая ведет себя точно так же, как <code>Array.prototype.filter()</code> , поможет нам в понимании её работы . Он может использовать либо цикл <code>for</code> либо <code>Array.prototype.forEach()</code> . Примечание. Чистая функция позволяет изменять локальные переменные, определенные в пределах ее области действия, хотя предпочтительно избегать этого. </section>
## Description
<section id='description'>
Реализация версии <code>filter</code>, которая ведет себя точно так же, как <code>Array.prototype.filter()</code> , поможет нам в понимании её работы . Он может использовать либо цикл <code>for</code> либо <code>Array.prototype.forEach()</code> . Примечание. Чистая функция позволяет изменять локальные переменные, определенные в пределах ее области действия, хотя предпочтительно избегать этого.
</section>
## Указания
<section id="instructions"> Напишите свой собственный <code>Array.prototype.myFilter()</code> , который должен вести себя точно так же, как <code>Array.prototype.filter()</code> . Вы можете использовать цикл <code>for</code> или метод <code>Array.prototype.forEach()</code> . </section>
## Instructions
<section id='instructions'>
Напишите свой собственный <code>Array.prototype.myFilter()</code> , который должен вести себя точно так же, как <code>Array.prototype.filter()</code> . Вы можете использовать цикл <code>for</code> или метод <code>Array.prototype.forEach()</code> .
</section>
## Тесты
## Tests
<section id='tests'>
```yml
tests:
- text: ''
testString: 'assert(JSON.stringify(new_s) === JSON.stringify([23, 65, 5]), "<code>new_s</code> should equal <code>[23, 65, 5]</code>.");'
- text: Ваш код не должен использовать метод <code>filter</code> .
testString: 'assert(!code.match(/\.filter/g), "Your code should not use the <code>filter</code> method.");'
- text: <code>new_s</code> should equal <code>[23, 65, 5]</code>.
testString: assert(JSON.stringify(new_s) === JSON.stringify([23, 65, 5]));
- text: Your code should not use the <code>filter</code> method.
testString: assert(!code.match(/\.filter/g));
```
</section>
## Исходные данные
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
@ -52,14 +56,29 @@ var new_s = s.myFilter(function(item){
</div>
</section>
## Решение
## Solution
<section id='solution'>
```js
// solution required
// the global Array
var s = [23, 65, 98, 5];
Array.prototype.myFilter = function(callback){
var newArray = [];
// Add your code below this line
for (let i = 0;i<this.length;i++) {
if (callback(this[i]))
newArray.push(this[i]);
}
// Add your code above this line
return newArray;
};
var new_s = s.myFilter(function(item){
return item % 2 === 1;
});
```
</section>

View File

@ -2,29 +2,74 @@
id: 587d7dab367417b2b2512b70
title: Introduction to Currying and Partial Application
challengeType: 1
videoUrl: ''
forumTopicId: 301232
localeTitle: Введение в каррирование и частичное применение
---
## Description
undefined
<section id='description'>
The <code>arity</code> of a function is the number of arguments it requires. <code>Currying</code> a function means to convert a function of N <code>arity</code> into N functions of <code>arity</code> 1.
In other words, it restructures a function so it takes one argument, then returns another function that takes the next argument, and so on.
Here's an example:
```js
//Un-curried function
function unCurried(x, y) {
return x + y;
}
//Curried function
function curried(x) {
return function(y) {
return x + y;
}
}
//Alternative using ES6
const curried = x => y => x + y
curried(1)(2) // Returns 3
```
This is useful in your program if you can't supply all the arguments to a function at one time. You can save each function call into a variable, which will hold the returned function reference that takes the next argument when it's available. Here's an example using the <code>curried</code> function in the example above:
```js
// Call a curried function in parts:
var funcForY = curried(1);
console.log(funcForY(2)); // Prints 3
```
Similarly, <code>partial application</code> can be described as applying a few arguments to a function at a time and returning another function that is applied to more arguments.
Here's an example:
```js
//Impartial function
function impartial(x, y, z) {
return x + y + z;
}
var partialFn = impartial.bind(this, 1, 2);
partialFn(10); // Returns 13
```
</section>
## Instructions
<section id="instructions"> Заполните тело функции <code>add</code> чтобы он использовал currying для добавления параметров <code>x</code> , <code>y</code> и <code>z</code> . </section>
<section id='instructions'>
Заполните тело функции <code>add</code> чтобы он использовал currying для добавления параметров <code>x</code> , <code>y</code> и <code>z</code> .
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: ''
testString: 'assert(add(10)(20)(30) === 60, "<code>add(10)(20)(30)</code> should return <code>60</code>.");'
- text: <code>add(1)(2)(3)</code> должен вернуть <code>6</code> .
testString: 'assert(add(1)(2)(3) === 6, "<code>add(1)(2)(3)</code> should return <code>6</code>.");'
- text: <code>add(11)(22)(33)</code> должен вернуться <code>66</code> .
testString: 'assert(add(11)(22)(33) === 66, "<code>add(11)(22)(33)</code> should return <code>66</code>.");'
- text: 'Ваш код должен содержать заключительный оператор, который возвращает <code>x + y + z</code> .'
testString: 'assert(code.match(/[xyz]\s*?\+\s*?[xyz]\s*?\+\s*?[xyz]/g), "Your code should include a final statement that returns <code>x + y + z</code>.");'
- text: <code>add(10)(20)(30)</code> should return <code>60</code>.
testString: assert(add(10)(20)(30) === 60);
- text: <code>add(1)(2)(3)</code> should return <code>6</code>.
testString: assert(add(1)(2)(3) === 6);
- text: <code>add(11)(22)(33)</code> should return <code>66</code>.
testString: assert(add(11)(22)(33) === 66);
- text: Your code should include a final statement that returns <code>x + y + z</code>.
testString: assert(code.match(/[xyz]\s*?\+\s*?[xyz]\s*?\+\s*?[xyz]/g));
```
@ -48,14 +93,13 @@ add(10)(20)(30);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
const add = x => y => z => x + y + z
```
</section>

View File

@ -2,25 +2,35 @@
id: 587d7b8d367417b2b2512b5b
title: Learn About Functional Programming
challengeType: 1
videoUrl: ''
forumTopicId: 301233
localeTitle: Узнайте о функциональном программировании
---
## Description
undefined
<section id='description'>
Functional programming is a style of programming where solutions are simple, isolated functions, without any side effects outside of the function scope.
<code>INPUT -> PROCESS -> OUTPUT</code>
Functional programming is about:
1) Isolated functions - there is no dependence on the state of the program, which includes global variables that are subject to change
2) Pure functions - the same input always gives the same output
3) Functions with limited side effects - any changes, or mutations, to the state of the program outside the function are carefully controlled
</section>
## Instructions
undefined
<section id='instructions'>
The members of freeCodeCamp happen to love tea.
In the code editor, the <code>prepareTea</code> and <code>getTea</code> functions are already defined for you. Call the <code>getTea</code> function to get 40 cups of tea for the team, and store them in the <code>tea4TeamFCC</code> variable.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: ''
testString: 'assert(tea4TeamFCC.length === 40, "The <code>tea4TeamFCC</code> variable should hold 40 cups of tea for the team.");'
- text: ''
testString: 'assert(tea4TeamFCC[0] === "greenTea", "The <code>tea4TeamFCC</code> variable should hold cups of green tea.");'
- text: The <code>tea4TeamFCC</code> variable should hold 40 cups of tea for the team.
testString: assert(tea4TeamFCC.length === 40);
- text: The <code>tea4TeamFCC</code> variable should hold cups of green tea.
testString: assert(tea4TeamFCC[0] === 'greenTea');
```
@ -66,8 +76,6 @@ console.log(tea4TeamFCC);
</div>
</section>
## Solution
@ -75,5 +83,20 @@ console.log(tea4TeamFCC);
```js
// solution required
const prepareTea = () => 'greenTea';
const getTea = (numOfCups) => {
const teaCups = [];
for(let cups = 1; cups <= numOfCups; cups += 1) {
const teaCup = prepareTea();
teaCups.push(teaCup);
}
return teaCups;
};
const tea4TeamFCC = getTea(40);
```
</section>

View File

@ -2,27 +2,31 @@
id: 587d7b8e367417b2b2512b5f
title: Pass Arguments to Avoid External Dependence in a Function
challengeType: 1
videoUrl: ''
localeTitle: 'Пропустить аргументы, чтобы избежать внешней зависимости в функции'
forumTopicId: 301234
localeTitle: Пропустить аргументы, чтобы избежать внешней зависимости в функции
---
## Description
<section id="description"> Последняя задача была шагом ближе к принципам функционального программирования, но до сих пор что-то не хватает. Мы не изменили значение глобальной переменной, но <code>incrementer</code> функции не получило бы работу без глобальной переменной <code>fixedValue</code> . Другим принципом функционального программирования является всегда декларировать ваши зависимости явно. Это означает, что если функция зависит от переменной или объекта, присутствующего, то передайте эту переменную или объект непосредственно в функцию в качестве аргумента. Из этого принципа есть несколько хороших последствий. Функция легче протестировать, вы точно знаете, какой вклад она принимает, и она не будет зависеть от чего-либо еще в вашей программе. Это может дать вам больше уверенности при изменении, удалении или добавлении нового кода. Вы знаете, что можете или не можете изменить, и вы можете увидеть, где находятся потенциальные ловушки. Наконец, функция всегда будет выводить один и тот же вывод для одного и того же набора входов, независимо от того, какая часть кода выполняет его. </section>
<section id='description'>
Последняя задача была шагом ближе к принципам функционального программирования, но до сих пор что-то не хватает. Мы не изменили значение глобальной переменной, но <code>incrementer</code> функции не получило бы работу без глобальной переменной <code>fixedValue</code> . Другим принципом функционального программирования является всегда декларировать ваши зависимости явно. Это означает, что если функция зависит от переменной или объекта, присутствующего, то передайте эту переменную или объект непосредственно в функцию в качестве аргумента. Из этого принципа есть несколько хороших последствий. Функция легче протестировать, вы точно знаете, какой вклад она принимает, и она не будет зависеть от чего-либо еще в вашей программе. Это может дать вам больше уверенности при изменении, удалении или добавлении нового кода. Вы знаете, что можете или не можете изменить, и вы можете увидеть, где находятся потенциальные ловушки. Наконец, функция всегда будет выводить один и тот же вывод для одного и того же набора входов, независимо от того, какая часть кода выполняет его.
</section>
## Instructions
<section id="instructions"> Давайте обновим функцию <code>incrementer</code> чтобы четко определить ее зависимости. Напишите функцию <code>incrementer</code> чтобы она приняла аргумент, а затем увеличила значение на единицу. </section>
<section id='instructions'>
Давайте обновим функцию <code>incrementer</code> чтобы четко определить ее зависимости. Напишите функцию <code>incrementer</code> чтобы она приняла аргумент, а затем увеличила значение на единицу.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш <code>incrementer</code> функции не должен изменять значение <code>fixedValue</code> .
testString: 'assert(fixedValue === 4, "Your function <code>incrementer</code> should not change the value of <code>fixedValue</code>.");'
- text: Ваша <code>incrementer</code> функция должна принимать параметр.
testString: 'assert(code.match(/function\s+?incrementer\s*?\(.+?\)/g), "Your <code>incrementer</code> function should take a parameter.");'
- text: 'Функция <code>incrementer</code> должна возвращать значение, которое больше значения <code>fixedValue</code> .'
testString: 'assert(newValue === 5, "Your <code>incrementer</code> function should return a value that is one larger than the <code>fixedValue</code> value.");'
- text: Your function <code>incrementer</code> should not change the value of <code>fixedValue</code>.
testString: assert(fixedValue === 4);
- text: Your <code>incrementer</code> function should take a parameter.
testString: assert(incrementer.length === 1);
- text: Your <code>incrementer</code> function should return a value that is one larger than the <code>fixedValue</code> value.
testString: assert(newValue === 5);
```
@ -51,14 +55,19 @@ console.log(fixedValue); // Should print 4
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
// the global variable
var fixedValue = 4;
const incrementer = val => val + 1;
var newValue = incrementer(fixedValue); // Should equal 5
console.log(fixedValue); // Should print 4
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7b8f367417b2b2512b60
title: Refactor Global Variables Out of Functions
challengeType: 1
videoUrl: ''
forumTopicId: 301235
localeTitle: Глобальные переменные Refactor вне функций
---
## Description
<section id="description"> До сих пор мы видели два разных принципа функционального программирования: 1) Не изменяйте переменную или объект - создавайте новые переменные и объекты и возвращайте их, если необходимо, из функции. 2) Объявлять аргументы функции - любое вычисление внутри функции зависит только от аргументов, а не от любого глобального объекта или переменной. Добавление одного к числу не очень интересно, но мы можем применять эти принципы при работе с массивами или более сложными объектами. </section>
<section id='description'>
До сих пор мы видели два разных принципа функционального программирования: 1) Не изменяйте переменную или объект - создавайте новые переменные и объекты и возвращайте их, если необходимо, из функции. 2) Объявлять аргументы функции - любое вычисление внутри функции зависит только от аргументов, а не от любого глобального объекта или переменной. Добавление одного к числу не очень интересно, но мы можем применять эти принципы при работе с массивами или более сложными объектами.
</section>
## Instructions
<section id="instructions"> Refactor (переписать) код, поэтому глобальный массив <code>bookList</code> не изменяется внутри любой функции. Функция <code>add</code> должна добавить данное имя <code>bookName</code> в конец массива. Функция <code>remove</code> должна удалить данную <code>bookName</code> из массива. Обе функции должны возвращать массив, и любые новые параметры должны быть добавлены до имени <code>bookName</code> . </section>
<section id='instructions'>
Refactor (переписать) код, поэтому глобальный массив <code>bookList</code> не изменяется внутри любой функции. Функция <code>add</code> должна добавить данное имя <code>bookName</code> в конец массива. Функция <code>remove</code> должна удалить данную <code>bookName</code> из массива. Обе функции должны возвращать массив, и любые новые параметры должны быть добавлены до имени <code>bookName</code> .
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: '<code>bookList</code> не должен меняться и <code>bookList</code> равным <code>[&quot;The Hound of the Baskervilles&quot;, &quot;On The Electrodynamics of Moving Bodies&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;]</code> .'
testString: 'assert(JSON.stringify(bookList) === JSON.stringify(["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]), "<code>bookList</code> should not change and still equal <code>["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]</code>.");'
- text: '<code>newBookList</code> должен равняться <code>[&quot;The Hound of the Baskervilles&quot;, &quot;On The Electrodynamics of Moving Bodies&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;, &quot;A Brief History of Time&quot;]</code> <code>newBookList</code> <code>[&quot;The Hound of the Baskervilles&quot;, &quot;On The Electrodynamics of Moving Bodies&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;, &quot;A Brief History of Time&quot;]</code> .'
testString: 'assert(JSON.stringify(newBookList) === JSON.stringify(["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]), "<code>newBookList</code> should equal <code>["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]</code>.");'
- text: '<code>newerBookList</code> должен равняться <code>[&quot;The Hound of the Baskervilles&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;]</code> <code>newerBookList</code> <code>[&quot;The Hound of the Baskervilles&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;]</code> .'
testString: 'assert(JSON.stringify(newerBookList) === JSON.stringify(["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]), "<code>newerBookList</code> should equal <code>["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]</code>.");'
- text: '<code>newestBookList</code> должен равняться <code>[&quot;The Hound of the Baskervilles&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;, &quot;A Brief History of Time&quot;]</code> <code>newestBookList</code> <code>[&quot;The Hound of the Baskervilles&quot;, &quot;Philosophiæ Naturalis Principia Mathematica&quot;, &quot;Disquisitiones Arithmeticae&quot;, &quot;A Brief History of Time&quot;]</code> .'
testString: 'assert(JSON.stringify(newestBookList) === JSON.stringify(["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]), "<code>newestBookList</code> should equal <code>["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]</code>.");'
- text: <code>bookList</code> should not change and still equal <code>["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]</code>.
testString: assert(JSON.stringify(bookList) === JSON.stringify(["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]));
- text: <code>newBookList</code> should equal <code>["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]</code>.
testString: assert(JSON.stringify(newBookList) === JSON.stringify(['The Hound of the Baskervilles', 'On The Electrodynamics of Moving Bodies', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae', 'A Brief History of Time']));
- text: <code>newerBookList</code> should equal <code>["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"]</code>.
testString: assert(JSON.stringify(newerBookList) === JSON.stringify(['The Hound of the Baskervilles', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae']));
- text: <code>newestBookList</code> should equal <code>["The Hound of the Baskervilles", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae", "A Brief History of Time"]</code>.
testString: assert(JSON.stringify(newestBookList) === JSON.stringify(['The Hound of the Baskervilles', 'Philosophiæ Naturalis Principia Mathematica', 'Disquisitiones Arithmeticae', 'A Brief History of Time']));
```
@ -40,13 +44,14 @@ tests:
var bookList = ["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"];
/* This function should add a book to the list and return the list */
// New parameters should come before the bookName one
// New parameters should come before bookName
// Add your code below this line
function add (bookName) {
return bookList.push(bookName);
bookList.push(bookName);
return bookList;
// Add your code above this line
}
@ -55,9 +60,11 @@ function add (bookName) {
// Add your code below this line
function remove (bookName) {
if (bookList.indexOf(bookName) >= 0) {
var book_index = bookList.indexOf(bookName);
if (book_index >= 0) {
return bookList.splice(0, 1, bookName);
bookList.splice(book_index, 1);
return bookList;
// Add your code above this line
}
@ -73,14 +80,41 @@ console.log(bookList);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
// the global variable
var bookList = ["The Hound of the Baskervilles", "On The Electrodynamics of Moving Bodies", "Philosophiæ Naturalis Principia Mathematica", "Disquisitiones Arithmeticae"];
/* This function should add a book to the list and return the list */
// New parameters should come before the bookName one
// Add your code below this line
function add (bookList, bookName) {
return [...bookList, bookName];
// Add your code above this line
}
/* This function should remove a book from the list and return the list */
// New parameters should come before the bookName one
// Add your code below this line
function remove (bookList, bookName) {
const bookListCopy = [...bookList];
const bookNameIndex = bookList.indexOf(bookName);
if (bookNameIndex >= 0) {
bookListCopy.splice(bookNameIndex, 1);
}
return bookListCopy;
// Add your code above this line
}
var newBookList = add(bookList, 'A Brief History of Time');
var newerBookList = remove(bookList, 'On The Electrodynamics of Moving Bodies');
var newestBookList = remove(add(bookList, 'A Brief History of Time'), 'On The Electrodynamics of Moving Bodies');
```
</section>

View File

@ -2,35 +2,39 @@
id: 9d7123c8c441eeafaeb5bdef
title: Remove Elements from an Array Using slice Instead of splice
challengeType: 1
videoUrl: ''
forumTopicId: 301236
localeTitle: Удаление элементов из массива используя slice вместо splice
---
## Описание
<section id="description"> Обычный случай при работе с массивами - это когда вы хотите удалить элементы и сохранить остальную часть массива. Для этого JavaScript предлагает метод <code>splice</code>, который принимает индекс того, где следует начинать удаление элементов, и количество элементов для удаления. Если второй аргумент не указан, по умолчанию удаляются элементы до конца массива. Однако метод <code>splice</code> мутирует исходный массив, на котором он вызывается. Вот пример: <blockquote> var cities = [&quot;Чикаго&quot;, &quot;Дели&quot;, &quot;Исламабад&quot;, &quot;Лондон&quot;, &quot;Берлин&quot;]; <br> cities.splice (3, 1); // Возвращает «Лондон» и удаляет его из массива городов <br> // города теперь [«Чикаго», «Дели», «Исламабад», «Берлин»] </blockquote> Как мы видели в последней задаче, метод <code>slice</code> не мутирует исходный массив, а возвращает новый, который можно сохранить в переменной. Напомним, что метод <code>slice</code> принимает два аргумента - индексы начала и канца среза (конец не включен) и возвращает эти элементы в новом массиве. Использование метода <code>slice</code> вместо <code>splice</code> помогает избежать любых побочных эффектов, связанных с массивом. </section>
## Description
<section id='description'>
Обычный случай при работе с массивами - это когда вы хотите удалить элементы и сохранить остальную часть массива. Для этого JavaScript предлагает метод <code>splice</code>, который принимает индекс того, где следует начинать удаление элементов, и количество элементов для удаления. Если второй аргумент не указан, по умолчанию удаляются элементы до конца массива. Однако метод <code>splice</code> мутирует исходный массив, на котором он вызывается. Вот пример: <blockquote> var cities = [&quot;Чикаго&quot;, &quot;Дели&quot;, &quot;Исламабад&quot;, &quot;Лондон&quot;, &quot;Берлин&quot;]; <br> cities.splice (3, 1); // Возвращает «Лондон» и удаляет его из массива городов <br> // города теперь [«Чикаго», «Дели», «Исламабад», «Берлин»] </blockquote> Как мы видели в последней задаче, метод <code>slice</code> не мутирует исходный массив, а возвращает новый, который можно сохранить в переменной. Напомним, что метод <code>slice</code> принимает два аргумента - индексы начала и канца среза (конец не включен) и возвращает эти элементы в новом массиве. Использование метода <code>slice</code> вместо <code>splice</code> помогает избежать любых побочных эффектов, связанных с массивом.
</section>
## Указания
<section id="instructions"> Перепишите функцию <code>nonMutatingSplice</code> , используя <code>slice</code> вместо <code>splice</code> . Он должен ограничивать массив предоставленных <code>cities</code> длиной до 3 и возвращать новый массив только с первыми тремя элементами. Не мутируйте исходный массив, предоставленный функции. </section>
## Instructions
<section id='instructions'>
Перепишите функцию <code>nonMutatingSplice</code> , используя <code>slice</code> вместо <code>splice</code> . Он должен ограничивать массив предоставленных <code>cities</code> длиной до 3 и возвращать новый массив только с первыми тремя элементами. Не мутируйте исходный массив, предоставленный функции.
</section>
## Тесты
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>slice</code> .
testString: 'assert(code.match(/\.slice/g), "Your code should use the <code>slice</code> method.");'
- text: Ваш код не должен использовать метод <code>splice</code> .
testString: 'assert(!code.match(/\.splice/g), "Your code should not use the <code>splice</code> method.");'
- text: Массив <code>inputCities</code> не должен изменяться.
testString: 'assert(JSON.stringify(inputCities) === JSON.stringify(["Chicago", "Delhi", "Islamabad", "London", "Berlin"]), "The <code>inputCities</code> array should not change.");'
- text: '<code>nonMutatingSplice([&quot;Chicago&quot;, &quot;Delhi&quot;, &quot;Islamabad&quot;, &quot;London&quot;, &quot;Berlin&quot;])</code> должны вернуться <code>[&quot;Chicago&quot;, &quot;Delhi&quot;, &quot;Islamabad&quot;]</code> .'
testString: 'assert(JSON.stringify(nonMutatingSplice(["Chicago", "Delhi", "Islamabad", "London", "Berlin"])) === JSON.stringify(["Chicago", "Delhi", "Islamabad"]), "<code>nonMutatingSplice(["Chicago", "Delhi", "Islamabad", "London", "Berlin"])</code> should return <code>["Chicago", "Delhi", "Islamabad"]</code>.");'
- text: Your code should use the <code>slice</code> method.
testString: assert(code.match(/\.slice/g));
- text: Your code should not use the <code>splice</code> method.
testString: assert(!code.match(/\.splice/g));
- text: The <code>inputCities</code> array should not change.
testString: assert(JSON.stringify(inputCities) === JSON.stringify(["Chicago", "Delhi", "Islamabad", "London", "Berlin"]));
- text: <code>nonMutatingSplice(["Chicago", "Delhi", "Islamabad", "London", "Berlin"])</code> should return <code>["Chicago", "Delhi", "Islamabad"]</code>.
testString: assert(JSON.stringify(nonMutatingSplice(["Chicago", "Delhi", "Islamabad", "London", "Berlin"])) === JSON.stringify(["Chicago", "Delhi", "Islamabad"]));
```
</section>
## Исходные данные
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
@ -49,14 +53,19 @@ nonMutatingSplice(inputCities);
</div>
</section>
## Решение
## Solution
<section id='solution'>
```js
// solution required
function nonMutatingSplice(cities) {
// Add your code below this line
return cities.slice(0,3);
// Add your code above this line
}
var inputCities = ["Chicago", "Delhi", "Islamabad", "London", "Berlin"];
nonMutatingSplice(inputCities);
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7da9367417b2b2512b6a
title: Return a Sorted Array Without Changing the Original Array
challengeType: 1
videoUrl: ''
forumTopicId: 301237
localeTitle: Возвращает отсортированный массив без изменения исходного массива
---
## Description
<section id="description"> Побочным эффектом метода <code>sort</code> является то, что он изменяет порядок элементов в исходном массиве. Другими словами, он мутирует массив на месте. Один из способов избежать этого - сначала связать пустой массив с тем, который был отсортирован (помните, что <code>concat</code> возвращает новый массив), затем запустите метод <code>sort</code> . </section>
<section id='description'>
Побочным эффектом метода <code>sort</code> является то, что он изменяет порядок элементов в исходном массиве. Другими словами, он мутирует массив на месте. Один из способов избежать этого - сначала связать пустой массив с тем, который был отсортирован (помните, что <code>concat</code> возвращает новый массив), затем запустите метод <code>sort</code> .
</section>
## Instructions
<section id="instructions"> Используйте метод <code>sort</code> в функции <code>nonMutatingSort</code> для сортировки элементов массива в порядке возрастания. Функция должна возвращать новый массив, а не мутировать переменную <code>globalArray</code> . </section>
<section id='instructions'>
Используйте метод <code>sort</code> в функции <code>nonMutatingSort</code> для сортировки элементов массива в порядке возрастания. Функция должна возвращать новый массив, а не мутировать переменную <code>globalArray</code> .
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>sort</code> .
testString: 'assert(code.match(/\.sort/g), "Your code should use the <code>sort</code> method.");'
- text: Ваш код должен использовать метод <code>concat</code> .
testString: 'assert(code.match(/\.concat/g), "Your code should use the <code>concat</code> method.");'
- text: Переменная <code>globalArray</code> не должна изменяться.
testString: 'assert(JSON.stringify(globalArray) === JSON.stringify([5, 6, 3, 2, 9]), "The <code>globalArray</code> variable should not change.");'
- text: '<code>nonMutatingSort(globalArray)</code> должен возвращать <code>[2, 3, 5, 6, 9]</code> .'
testString: 'assert(JSON.stringify(nonMutatingSort(globalArray)) === JSON.stringify([2, 3, 5, 6, 9]), "<code>nonMutatingSort(globalArray)</code> should return <code>[2, 3, 5, 6, 9]</code>.");'
- text: Your code should use the <code>sort</code> method.
testString: assert(nonMutatingSort.toString().match(/\.sort/g));
- text: The <code>globalArray</code> variable should not change.
testString: assert(JSON.stringify(globalArray) === JSON.stringify([5, 6, 3, 2, 9]));
- text: <code>nonMutatingSort(globalArray)</code> should return <code>[2, 3, 5, 6, 9]</code>.
testString: assert(JSON.stringify(nonMutatingSort(globalArray)) === JSON.stringify([2, 3, 5, 6, 9]));
- text: <code>nonMutatingSort(globalArray)</code> should not be hard coded.
testString: assert(!nonMutatingSort.toString().match(/[23569]/g));
```
@ -49,14 +53,19 @@ nonMutatingSort(globalArray);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
var globalArray = [5, 6, 3, 2, 9];
function nonMutatingSort(arr) {
// Add your code below this line
return [].concat(arr).sort((a,b) => a-b);
// Add your code above this line
}
nonMutatingSort(globalArray);
```
</section>

View File

@ -2,31 +2,35 @@
id: 587d7b90367417b2b2512b65
title: Return Part of an Array Using the slice Method
challengeType: 1
videoUrl: ''
forumTopicId: 301239
localeTitle: Возвращаемая часть массива Использование метода среза
---
## Description
<section id="description"> Метод <code>slice</code> возвращает копию некоторых элементов массива. Он может принимать два аргумента, первый дает индекс, где начинается срез, второй - индекс для того, где положить конец среза (и он не включен). Если аргументы не предоставлены, по умолчанию начинается с начала массива до конца, что является простым способом сделать копию всего массива. Метод <code>slice</code> не изменяет исходный массив, а возвращает новый. Вот пример: <blockquote> var arr = [&quot;Cat&quot;, &quot;Dog&quot;, &quot;Tiger&quot;, &quot;Zebra&quot;]; <br> var newArray = arr.slice (1, 3); <br> // Устанавливает newArray в [«Собака», «Тигр»] </blockquote></section>
<section id='description'>
Метод <code>slice</code> возвращает копию некоторых элементов массива. Он может принимать два аргумента, первый дает индекс, где начинается срез, второй - индекс для того, где положить конец среза (и он не включен). Если аргументы не предоставлены, по умолчанию начинается с начала массива до конца, что является простым способом сделать копию всего массива. Метод <code>slice</code> не изменяет исходный массив, а возвращает новый. Вот пример: <blockquote> var arr = [&quot;Cat&quot;, &quot;Dog&quot;, &quot;Tiger&quot;, &quot;Zebra&quot;]; <br> var newArray = arr.slice (1, 3); <br> // Устанавливает newArray в [«Собака», «Тигр»] </blockquote>
</section>
## Instructions
<section id="instructions"> Используйте <code>slice</code> метод в <code>sliceArray</code> функции вернуть часть <code>anim</code> массива , учитывая предоставленные <code>beginSlice</code> и <code>endSlice</code> индексов. Функция должна возвращать массив. </section>
<section id='instructions'>
Используйте <code>slice</code> метод в <code>sliceArray</code> функции вернуть часть <code>anim</code> массива , учитывая предоставленные <code>beginSlice</code> и <code>endSlice</code> индексов. Функция должна возвращать массив.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>slice</code> .
testString: 'assert(code.match(/\.slice/g), "Your code should use the <code>slice</code> method.");'
- text: Переменная <code>inputAnim</code> не должна изменяться.
testString: 'assert(JSON.stringify(inputAnim) === JSON.stringify(["Cat", "Dog", "Tiger", "Zebra", "Ant"]), "The <code>inputAnim</code> variable should not change.");'
- text: '<code>sliceArray([&quot;Cat&quot;, &quot;Dog&quot;, &quot;Tiger&quot;, &quot;Zebra&quot;, &quot;Ant&quot;], 1, 3)</code> должны вернуть <code>[&quot;Dog&quot;, &quot;Tiger&quot;]</code> .'
testString: 'assert(JSON.stringify(sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 3)) === JSON.stringify(["Dog", "Tiger"]), "<code>sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 3)</code> should return <code>["Dog", "Tiger"]</code>.");'
- text: '<code>sliceArray([&quot;Cat&quot;, &quot;Dog&quot;, &quot;Tiger&quot;, &quot;Zebra&quot;, &quot;Ant&quot;], 0, 1)</code> должны возвращать <code>[&quot;Cat&quot;]</code> .'
testString: 'assert(JSON.stringify(sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 0, 1)) === JSON.stringify(["Cat"]), "<code>sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 0, 1)</code> should return <code>["Cat"]</code>.");'
- text: '<code>sliceArray([&quot;Cat&quot;, &quot;Dog&quot;, &quot;Tiger&quot;, &quot;Zebra&quot;, &quot;Ant&quot;], 1, 4)</code> должны возвращать <code>[&quot;Dog&quot;, &quot;Tiger&quot;, &quot;Zebra&quot;]</code> .'
testString: 'assert(JSON.stringify(sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 4)) === JSON.stringify(["Dog", "Tiger", "Zebra"]), "<code>sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 4)</code> should return <code>["Dog", "Tiger", "Zebra"]</code>.");'
- text: Your code should use the <code>slice</code> method.
testString: assert(code.match(/\.slice/g));
- text: The <code>inputAnim</code> variable should not change.
testString: assert(JSON.stringify(inputAnim) === JSON.stringify(["Cat", "Dog", "Tiger", "Zebra", "Ant"]));
- text: <code>sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 3)</code> should return <code>["Dog", "Tiger"]</code>.
testString: assert(JSON.stringify(sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 3)) === JSON.stringify(["Dog", "Tiger"]));
- text: <code>sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 0, 1)</code> should return <code>["Cat"]</code>.
testString: assert(JSON.stringify(sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 0, 1)) === JSON.stringify(["Cat"]));
- text: <code>sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 4)</code> should return <code>["Dog", "Tiger", "Zebra"]</code>.
testString: assert(JSON.stringify(sliceArray(["Cat", "Dog", "Tiger", "Zebra", "Ant"], 1, 4)) === JSON.stringify(["Dog", "Tiger", "Zebra"]));
```
@ -51,14 +55,19 @@ sliceArray(inputAnim, 1, 3);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
function sliceArray(anim, beginSlice, endSlice) {
// Add your code below this line
return anim.slice(beginSlice, endSlice)
// Add your code above this line
}
var inputAnim = ["Cat", "Dog", "Tiger", "Zebra", "Ant"];
sliceArray(inputAnim, 1, 3);
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7da9367417b2b2512b69
title: Sort an Array Alphabetically using the sort Method
challengeType: 1
videoUrl: ''
forumTopicId: 18303
localeTitle: Сортировка массива по алфавиту с помощью метода сортировки
---
## Description
<section id="description"> Метод <code>sort</code> сортирует элементы массива в соответствии с функцией обратного вызова. Например: <blockquote> функция ascendingOrder (arr) { <br> return arr.sort (функция (a, b) { <br> return a - b; <br> }); <br> } <br> ascendingOrder ([1, 5, 2, 3, 4]); <br> // Возвращает [1, 2, 3, 4, 5] <br><br> функция reverseAlpha (arr) { <br> return arr.sort (функция (a, b) { <br> return a &lt;b; <br> }); <br> } <br> reverseAlpha ([&#39;l&#39;, &#39;h&#39;, &#39;z&#39;, &#39;b&#39;, &#39;s&#39;]); <br> // Возвращает [&#39;z&#39;, &#39;s&#39;, &#39;l&#39;, &#39;h&#39;, &#39;b&#39;] </blockquote> Примечание. Рекомендуется указать функцию обратного вызова, чтобы указать способ сортировки элементов массива. Метод сортировки по умолчанию JavaScript - это значение строки Unicode, которое может возвращать неожиданные результаты. </section>
<section id='description'>
Метод <code>sort</code> сортирует элементы массива в соответствии с функцией обратного вызова. Например: <blockquote> функция ascendingOrder (arr) { <br> return arr.sort (функция (a, b) { <br> return a - b; <br> }); <br> } <br> ascendingOrder ([1, 5, 2, 3, 4]); <br> // Возвращает [1, 2, 3, 4, 5] <br><br> функция reverseAlpha (arr) { <br> return arr.sort (функция (a, b) { <br> return a &lt;b; <br> }); <br> } <br> reverseAlpha ([&#39;l&#39;, &#39;h&#39;, &#39;z&#39;, &#39;b&#39;, &#39;s&#39;]); <br> // Возвращает [&#39;z&#39;, &#39;s&#39;, &#39;l&#39;, &#39;h&#39;, &#39;b&#39;] </blockquote> Примечание. Рекомендуется указать функцию обратного вызова, чтобы указать способ сортировки элементов массива. Метод сортировки по умолчанию JavaScript - это значение строки Unicode, которое может возвращать неожиданные результаты.
</section>
## Instructions
<section id="instructions"> Используйте метод <code>sort</code> в функции <code>alphabeticalOrder</code> для сортировки элементов <code>arr</code> в алфавитном порядке. </section>
<section id='instructions'>
Используйте метод <code>sort</code> в функции <code>alphabeticalOrder</code> для сортировки элементов <code>arr</code> в алфавитном порядке.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>sort</code> .
testString: 'assert(code.match(/\.sort/g), "Your code should use the <code>sort</code> method.");'
- text: ''
testString: 'assert(JSON.stringify(alphabeticalOrder(["a", "d", "c", "a", "z", "g"])) === JSON.stringify(["a", "a", "c", "d", "g", "z"]), "<code>alphabeticalOrder(["a", "d", "c", "a", "z", "g"])</code> should return <code>["a", "a", "c", "d", "g", "z"]</code>.");'
- text: ''
testString: 'assert(JSON.stringify(alphabeticalOrder(["x", "h", "a", "m", "n", "m"])) === JSON.stringify(["a", "h", "m", "m", "n", "x"]), "<code>alphabeticalOrder(["x", "h", "a", "m", "n", "m"])</code> should return <code>["a", "h", "m", "m", "n", "x"]</code>.");'
- text: ''
testString: 'assert(JSON.stringify(alphabeticalOrder(["a", "a", "a", "a", "x", "t"])) === JSON.stringify(["a", "a", "a", "a", "t", "x"]), "<code>alphabeticalOrder(["a", "a", "a", "a", "x", "t"])</code> should return <code>["a", "a", "a", "a", "t", "x"]</code>.");'
- text: Your code should use the <code>sort</code> method.
testString: assert(code.match(/\.sort/g));
- text: <code>alphabeticalOrder(["a", "d", "c", "a", "z", "g"])</code> should return <code>["a", "a", "c", "d", "g", "z"]</code>.
testString: assert(JSON.stringify(alphabeticalOrder(["a", "d", "c", "a", "z", "g"])) === JSON.stringify(["a", "a", "c", "d", "g", "z"]));
- text: <code>alphabeticalOrder(["x", "h", "a", "m", "n", "m"])</code> should return <code>["a", "h", "m", "m", "n", "x"]</code>.
testString: assert(JSON.stringify(alphabeticalOrder(["x", "h", "a", "m", "n", "m"])) === JSON.stringify(["a", "h", "m", "m", "n", "x"]));
- text: <code>alphabeticalOrder(["a", "a", "a", "a", "x", "t"])</code> should return <code>["a", "a", "a", "a", "t", "x"]</code>.
testString: assert(JSON.stringify(alphabeticalOrder(["a", "a", "a", "a", "x", "t"])) === JSON.stringify(["a", "a", "a", "a", "t", "x"]));
```
@ -48,14 +52,18 @@ alphabeticalOrder(["a", "d", "c", "a", "z", "g"]);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
function alphabeticalOrder(arr) {
// Add your code below this line
return arr.sort();
// Add your code above this line
}
alphabeticalOrder(["a", "d", "c", "a", "z", "g"]);
```
</section>

View File

@ -2,35 +2,39 @@
id: 587d7daa367417b2b2512b6b
title: Split a String into an Array Using the split Method
challengeType: 1
videoUrl: ''
forumTopicId: 18305
localeTitle: Разбить строку на массив используя метод split
---
## Описание
<section id="description"> Метод <code>split</code> разбивает строку на массив строк. В качестве аргумента она принимает разделитель, который может быть символом или регулярным выражением и используется для разбиения строки. Например, если разделитель является пробелом, вы получаете массив слов, и если разделитель является пустой строкой, вы получаете массив из символов строки. Вот два примера, которые разбивают одну строку пробелами, а затем цифрами, используя регулярное выражение: <blockquote> var str = &quot;Hello World&quot;; <br> var bySpace = str.split (&quot;&quot;); <br> // Устанавливает bySpace в [&quot;Hello&quot;, &quot;World&quot;] <br><br> var otherString = &quot;How9are7you2today&quot;; <br> var byDigits = otherString.split (/ \ d /); <br> // Устанавливает byDigits в [&quot;How&quot;, &quot;are&quot;, &quot;you&quot;, &quot;today&quot;] </blockquote> Поскольку строки неизменяемы, метод <code>split</code> облегчает работу с ними. </section>
## Description
<section id='description'>
Метод <code>split</code> разбивает строку на массив строк. В качестве аргумента она принимает разделитель, который может быть символом или регулярным выражением и используется для разбиения строки. Например, если разделитель является пробелом, вы получаете массив слов, и если разделитель является пустой строкой, вы получаете массив из символов строки. Вот два примера, которые разбивают одну строку пробелами, а затем цифрами, используя регулярное выражение: <blockquote> var str = &quot;Hello World&quot;; <br> var bySpace = str.split (&quot;&quot;); <br> // Устанавливает bySpace в [&quot;Hello&quot;, &quot;World&quot;] <br><br> var otherString = &quot;How9are7you2today&quot;; <br> var byDigits = otherString.split (/ \ d /); <br> // Устанавливает byDigits в [&quot;How&quot;, &quot;are&quot;, &quot;you&quot;, &quot;today&quot;] </blockquote> Поскольку строки неизменяемы, метод <code>split</code> облегчает работу с ними.
</section>
## Указания
<section id="instructions"> Используйте метод <code>split</code> внутри функции <code>splitify</code> чтобы разбить <code>str</code> на массив слов. Функция должна возвращать массив. Обратите внимание, что слова не всегда разделяются пробелами, и массив не должен содержать знаков препинания. </section>
## Instructions
<section id='instructions'>
Используйте метод <code>split</code> внутри функции <code>splitify</code> чтобы разбить <code>str</code> на массив слов. Функция должна возвращать массив. Обратите внимание, что слова не всегда разделяются пробелами, и массив не должен содержать знаков препинания.
</section>
## Тесты
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать метод <code>split</code> .
testString: 'assert(code.match(/\.split/g), "Your code should use the <code>split</code> method.");'
- text: '<code>splitify(&quot;Hello World,I-am code&quot;)</code> должен возвращать <code>[&quot;Hello&quot;, &quot;World&quot;, &quot;I&quot;, &quot;am&quot;, &quot;code&quot;]</code> .'
testString: 'assert(JSON.stringify(splitify("Hello World,I-am code")) === JSON.stringify(["Hello", "World", "I", "am", "code"]), "<code>splitify("Hello World,I-am code")</code> should return <code>["Hello", "World", "I", "am", "code"]</code>.");'
- text: '<code>splitify(&quot;Earth-is-our home&quot;)</code> должна вернуться <code>[&quot;Earth&quot;, &quot;is&quot;, &quot;our&quot;, &quot;home&quot;]</code> .'
testString: 'assert(JSON.stringify(splitify("Earth-is-our home")) === JSON.stringify(["Earth", "is", "our", "home"]), "<code>splitify("Earth-is-our home")</code> should return <code>["Earth", "is", "our", "home"]</code>.");'
- text: '<code>splitify(&quot;This.is.a-sentence&quot;)</code> должен возвращать <code>[&quot;This&quot;, &quot;is&quot;, &quot;a&quot;, &quot;sentence&quot;]</code> .'
testString: 'assert(JSON.stringify(splitify("This.is.a-sentence")) === JSON.stringify(["This", "is", "a", "sentence"]), "<code>splitify("This.is.a-sentence")</code> should return <code>["This", "is", "a", "sentence"]</code>.");'
- text: Your code should use the <code>split</code> method.
testString: assert(code.match(/\.split/g));
- text: <code>splitify("Hello World,I-am code")</code> should return <code>["Hello", "World", "I", "am", "code"]</code>.
testString: assert(JSON.stringify(splitify("Hello World,I-am code")) === JSON.stringify(["Hello", "World", "I", "am", "code"]));
- text: <code>splitify("Earth-is-our home")</code> should return <code>["Earth", "is", "our", "home"]</code>.
testString: assert(JSON.stringify(splitify("Earth-is-our home")) === JSON.stringify(["Earth", "is", "our", "home"]));
- text: <code>splitify("This.is.a-sentence")</code> should return <code>["This", "is", "a", "sentence"]</code>.
testString: assert(JSON.stringify(splitify("This.is.a-sentence")) === JSON.stringify(["This", "is", "a", "sentence"]));
```
</section>
## Исходные данные
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
@ -48,14 +52,17 @@ splitify("Hello World,I-am code");
</div>
</section>
## Решение
## Solution
<section id='solution'>
```js
// solution required
function splitify(str) {
// Add your code below this line
return str.split(/\W/);
// Add your code above this line
}
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7b8e367417b2b2512b5c
title: Understand Functional Programming Terminology
challengeType: 1
videoUrl: ''
forumTopicId: 301240
localeTitle: Понять терминологию функционального программирования
---
## Description
<section id="description"> Команда FCC почувствовала колебание настроения и теперь хочет два типа чая: зеленый чай и черный чай. Общий факт: колебания настроения у клиентов довольно распространены. С этой информацией нам нужно будет вернуться к функции <code>getTea</code> из последнего вызова, чтобы обрабатывать различные запросы на чай. Мы можем модифицировать <code>getTea</code> чтобы принять функцию в качестве параметра, чтобы иметь возможность изменять тип чая, который он готовит. Это делает <code>getTea</code> более гибким и дает программисту больше контроля при изменении запросов клиента. Но сначала давайте рассмотрим функциональную терминологию: <code>Callbacks</code> вызовы - это функции, которые были проскальзываны или переданы в другую функцию, чтобы решить вызов этой функции. Возможно, вы видели, как они передавались другим методам, например, в <code>filter</code> , функция обратного вызова сообщает JavaScript критериям фильтрации массива. Функции, которые могут быть назначены переменной, переданы в другую функцию или возвращены из другой функции, как и любое другое нормальное значение, называются функциями <code>first class</code> . В JavaScript все функции являются функциями <code>first class</code> . Функции, которые принимают функцию в качестве аргумента или возвращают функцию в качестве возвращаемого значения, называются функциями <code>higher order</code> . Когда функции передаются другой функции или возвращаются из другой функции, то те функции, которые передаются или возвращаются, можно назвать <code>lambda</code> . </section>
<section id='description'>
Команда FCC почувствовала колебание настроения и теперь хочет два типа чая: зеленый чай и черный чай. Общий факт: колебания настроения у клиентов довольно распространены. С этой информацией нам нужно будет вернуться к функции <code>getTea</code> из последнего вызова, чтобы обрабатывать различные запросы на чай. Мы можем модифицировать <code>getTea</code> чтобы принять функцию в качестве параметра, чтобы иметь возможность изменять тип чая, который он готовит. Это делает <code>getTea</code> более гибким и дает программисту больше контроля при изменении запросов клиента. Но сначала давайте рассмотрим функциональную терминологию: <code>Callbacks</code> вызовы - это функции, которые были проскальзываны или переданы в другую функцию, чтобы решить вызов этой функции. Возможно, вы видели, как они передавались другим методам, например, в <code>filter</code> , функция обратного вызова сообщает JavaScript критериям фильтрации массива. Функции, которые могут быть назначены переменной, переданы в другую функцию или возвращены из другой функции, как и любое другое нормальное значение, называются функциями <code>first class</code> . В JavaScript все функции являются функциями <code>first class</code> . Функции, которые принимают функцию в качестве аргумента или возвращают функцию в качестве возвращаемого значения, называются функциями <code>higher order</code> . Когда функции передаются другой функции или возвращаются из другой функции, то те функции, которые передаются или возвращаются, можно назвать <code>lambda</code> .
</section>
## Instructions
<section id="instructions"> Подготовьте 27 чашек зеленого чая и 13 чашек черного чая и храните их в параметрах <code>tea4GreenTeamFCC</code> и <code>tea4BlackTeamFCC</code> , соответственно. Обратите внимание, что функция <code>getTea</code> была изменена, поэтому теперь она принимает функцию в качестве первого аргумента. Примечание. Данные (количество чашек чая) поставляются в качестве последнего аргумента. Мы обсудим это более подробно на более поздних уроках. </section>
<section id='instructions'>
Подготовьте 27 чашек зеленого чая и 13 чашек черного чая и храните их в параметрах <code>tea4GreenTeamFCC</code> и <code>tea4BlackTeamFCC</code> , соответственно. Обратите внимание, что функция <code>getTea</code> была изменена, поэтому теперь она принимает функцию в качестве первого аргумента. Примечание. Данные (количество чашек чая) поставляются в качестве последнего аргумента. Мы обсудим это более подробно на более поздних уроках.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Переменная <code>tea4GreenTeamFCC</code> должна содержать 27 чашек зеленого чая для команды.
testString: 'assert(tea4GreenTeamFCC.length === 27, "The <code>tea4GreenTeamFCC</code> variable should hold 27 cups of green tea for the team.");'
- text: Переменная <code>tea4GreenTeamFCC</code> должна содержать чашки зеленого чая.
testString: 'assert(tea4GreenTeamFCC[0] === "greenTea", "The <code>tea4GreenTeamFCC</code> variable should hold cups of green tea.");'
- text: Переменная <code>tea4BlackTeamFCC</code> должна содержать 13 чашек черного чая.
testString: 'assert(tea4BlackTeamFCC.length === 13, "The <code>tea4BlackTeamFCC</code> variable should hold 13 cups of black tea.");'
- text: Переменная <code>tea4BlackTeamFCC</code> должна содержать чашки черного чая.
testString: 'assert(tea4BlackTeamFCC[0] === "blackTea", "The <code>tea4BlackTeamFCC</code> variable should hold cups of black tea.");'
- text: The <code>tea4GreenTeamFCC</code> variable should hold 27 cups of green tea for the team.
testString: assert(tea4GreenTeamFCC.length === 27);
- text: The <code>tea4GreenTeamFCC</code> variable should hold cups of green tea.
testString: assert(tea4GreenTeamFCC[0] === 'greenTea');
- text: The <code>tea4BlackTeamFCC</code> variable should hold 13 cups of black tea.
testString: assert(tea4BlackTeamFCC.length === 13);
- text: The <code>tea4BlackTeamFCC</code> variable should hold cups of black tea.
testString: assert(tea4BlackTeamFCC[0] === 'blackTea');
```
@ -81,8 +85,6 @@ console.log(
</div>
</section>
## Solution
@ -90,5 +92,21 @@ console.log(
```js
// solution required
const prepareGreenTea = () => 'greenTea';
const prepareBlackTea = () => 'blackTea';
const getTea = (prepareTea, numOfCups) => {
const teaCups = [];
for(let cups = 1; cups <= numOfCups; cups += 1) {
const teaCup = prepareTea();
teaCups.push(teaCup);
}
return teaCups;
};
const tea4BlackTeamFCC = getTea(prepareBlackTea, 13);
const tea4GreenTeamFCC = getTea(prepareGreenTea, 27);
```
</section>

View File

@ -2,23 +2,29 @@
id: 587d7b8e367417b2b2512b5d
title: Understand the Hazards of Using Imperative Code
challengeType: 1
videoUrl: ''
forumTopicId: 301241
localeTitle: Понимание опасностей использования императивного кода
---
## Description
<section id="description"> Функциональное программирование - хорошая привычка. Он упрощает управление вашим кодом и избавляет вас от подлых ошибок. Но прежде чем мы туда доберемся, давайте посмотрим на императивный подход к программированию, чтобы подчеркнуть, где у вас могут быть проблемы. На английском (и на многих других языках) императивное время используется для команд. Аналогичным образом, императивный стиль программирования - это тот, который дает компьютеру набор операторов для выполнения задачи. Часто утверждения изменяют состояние программы, например, обновление глобальных переменных. Классическим примером является запись цикла <code>for</code> который дает точные указания для итерации по индексам массива. Напротив, функциональное программирование является формой декларативного программирования. Вы говорите компьютеру, что вы хотите сделать, вызвав метод или функцию. JavaScript предлагает множество предопределенных методов, которые обрабатывают общие задачи, поэтому вам не нужно записывать, как компьютер должен их выполнять. Например, вместо использования цикла <code>for</code> упомянутого выше, вы можете вызвать метод <code>map</code> который обрабатывает детали итерации по массиву. Это помогает избежать семантических ошибок, таких как «Ошибки по одному», которые были описаны в разделе «Отладка». Рассмотрим сценарий: вы просматриваете веб-страницы в своем браузере и хотите отслеживать открытые вкладки. Попробуем смоделировать это, используя простой объектно-ориентированный код. Объект Window состоит из вкладок, и обычно у вас открыто более одного окна. Заголовки каждого открытого сайта в каждом объекте Window хранятся в массиве. После работы в браузере (открытие новых вкладок, слияние окон и закрытие вкладок) вы хотите распечатать вкладки, которые все еще открыты. Закрытые вкладки удаляются из массива, а новые вкладки (для простоты) добавляются к концу. Редактор кода показывает реализацию этой функции с функциями для <code>tabOpen()</code> , <code>tabClose()</code> и <code>join()</code> . <code>tabs</code> массива являются частью объекта Window, который хранит имя открытых страниц. <h4> инструкции </h4><h4> Запустите код в редакторе. Он использует метод, который имеет побочные эффекты в программе, вызывая неправильный вывод. Окончательный список открытых вкладок должен быть <code>[&#39;FB&#39;, &#39;Gitter&#39;, &#39;Reddit&#39;, &#39;Twitter&#39;, &#39;Medium&#39;, &#39;new tab&#39;, &#39;Netflix&#39;, &#39;YouTube&#39;, &#39;Vine&#39;, &#39;GMail&#39;, &#39;Work mail&#39;, &#39;Docs&#39;, &#39;freeCodeCamp&#39;, &#39;new tab&#39;]</code> но результат будет немного отличаться. Проработайте код и посмотрите, можете ли вы решить проблему, затем перейдите к следующему заданию, чтобы узнать больше. </h4></section>
<section id='description'>
Функциональное программирование - хорошая привычка. Он упрощает управление вашим кодом и избавляет вас от подлых ошибок. Но прежде чем мы туда доберемся, давайте посмотрим на императивный подход к программированию, чтобы подчеркнуть, где у вас могут быть проблемы. На английском (и на многих других языках) императивное время используется для команд. Аналогичным образом, императивный стиль программирования - это тот, который дает компьютеру набор операторов для выполнения задачи. Часто утверждения изменяют состояние программы, например, обновление глобальных переменных. Классическим примером является запись цикла <code>for</code> который дает точные указания для итерации по индексам массива. Напротив, функциональное программирование является формой декларативного программирования. Вы говорите компьютеру, что вы хотите сделать, вызвав метод или функцию. JavaScript предлагает множество предопределенных методов, которые обрабатывают общие задачи, поэтому вам не нужно записывать, как компьютер должен их выполнять. Например, вместо использования цикла <code>for</code> упомянутого выше, вы можете вызвать метод <code>map</code> который обрабатывает детали итерации по массиву. Это помогает избежать семантических ошибок, таких как «Ошибки по одному», которые были описаны в разделе «Отладка». Рассмотрим сценарий: вы просматриваете веб-страницы в своем браузере и хотите отслеживать открытые вкладки. Попробуем смоделировать это, используя простой объектно-ориентированный код. Объект Window состоит из вкладок, и обычно у вас открыто более одного окна. Заголовки каждого открытого сайта в каждом объекте Window хранятся в массиве. После работы в браузере (открытие новых вкладок, слияние окон и закрытие вкладок) вы хотите распечатать вкладки, которые все еще открыты. Закрытые вкладки удаляются из массива, а новые вкладки (для простоты) добавляются к концу. Редактор кода показывает реализацию этой функции с функциями для <code>tabOpen()</code> , <code>tabClose()</code> и <code>join()</code> . <code>tabs</code> массива являются частью объекта Window, который хранит имя открытых страниц. <h4> инструкции </h4><h4> Запустите код в редакторе. Он использует метод, который имеет побочные эффекты в программе, вызывая неправильный вывод. Окончательный список открытых вкладок должен быть <code>[&#39;FB&#39;, &#39;Gitter&#39;, &#39;Reddit&#39;, &#39;Twitter&#39;, &#39;Medium&#39;, &#39;new tab&#39;, &#39;Netflix&#39;, &#39;YouTube&#39;, &#39;Vine&#39;, &#39;GMail&#39;, &#39;Work mail&#39;, &#39;Docs&#39;, &#39;freeCodeCamp&#39;, &#39;new tab&#39;]</code> но результат будет немного отличаться. Проработайте код и посмотрите, можете ли вы решить проблему, затем перейдите к следующему заданию, чтобы узнать больше. </h4>
</section>
## Instructions
undefined
<section id='instructions'>
Examine the code in the editor. It's using a method that has side effects in the program, causing incorrect behaviour. The final list of open tabs, stored in <code>finalTabs.tabs</code>, should be <code>['FB', 'Gitter', 'Reddit', 'Twitter', 'Medium', 'new tab', 'Netflix', 'YouTube', 'Vine', 'GMail', 'Work mail', 'Docs', 'freeCodeCamp', 'new tab']</code> but the list produced by the code is slightly different.
Change <code>Window.prototype.tabClose</code> so that it removes the correct tab.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: 'Двигайтесь вперед, чтобы понять ошибку.'
testString: 'assert(true, "Move ahead to understand the error.");'
- text: <code>finalTabs.tabs</code> should be <code>['FB', 'Gitter', 'Reddit', 'Twitter', 'Medium', 'new tab', 'Netflix', 'YouTube', 'Vine', 'GMail', 'Work mail', 'Docs', 'freeCodeCamp', 'new tab']</code>
testString: assert.deepEqual(finalTabs.tabs, ['FB', 'Gitter', 'Reddit', 'Twitter', 'Medium', 'new tab', 'Netflix', 'YouTube', 'Vine', 'GMail', 'Work mail', 'Docs', 'freeCodeCamp', 'new tab'])
```
@ -49,8 +55,62 @@ Window.prototype.tabOpen = function (tab) {
// When you close a tab
Window.prototype.tabClose = function (index) {
// Only change code below this line
var tabsBeforeIndex = this.tabs.splice(0, index); // get the tabs before the tab
var tabsAfterIndex = this.tabs.splice(index); // get the tabs after the tab
var tabsAfterIndex = this.tabs.splice(index + 1); // get the tabs after the tab
this.tabs = tabsBeforeIndex.concat(tabsAfterIndex); // join them together
// Only change code above this line
return this;
};
// Let's create three browser windows
var workWindow = new Window(['GMail', 'Inbox', 'Work mail', 'Docs', 'freeCodeCamp']); // Your mailbox, drive, and other work sites
var socialWindow = new Window(['FB', 'Gitter', 'Reddit', 'Twitter', 'Medium']); // Social sites
var videoWindow = new Window(['Netflix', 'YouTube', 'Vimeo', 'Vine']); // Entertainment sites
// Now perform the tab opening, closing, and other operations
var finalTabs = socialWindow
.tabOpen() // Open a new tab for cat memes
.join(videoWindow.tabClose(2)) // Close third tab in video window, and join
.join(workWindow.tabClose(1).tabOpen());
console.log(finalTabs.tabs);
```
</div>
</section>
## Solution
<section id='solution'>
```js
// tabs is an array of titles of each site open within the window
var Window = function(tabs) {
this.tabs = tabs; // we keep a record of the array inside the object
};
// When you join two windows into one window
Window.prototype.join = function (otherWindow) {
this.tabs = this.tabs.concat(otherWindow.tabs);
return this;
};
// When you open a new tab at the end
Window.prototype.tabOpen = function (tab) {
this.tabs.push('new tab'); // let's open a new tab for now
return this;
};
// When you close a tab
Window.prototype.tabClose = function (index) {
var tabsBeforeIndex = this.tabs.slice(0, index); // get the tabs before the tab
var tabsAfterIndex = this.tabs.slice(index + 1); // get the tabs after the tab
this.tabs = tabsBeforeIndex.concat(tabsAfterIndex); // join them together
return this;
@ -66,21 +126,6 @@ var finalTabs = socialWindow
.tabOpen() // Open a new tab for cat memes
.join(videoWindow.tabClose(2)) // Close third tab in video window, and join
.join(workWindow.tabClose(1).tabOpen());
alert(finalTabs.tabs);
```
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7dab367417b2b2512b6e
title: Use the every Method to Check that Every Element in an Array Meets a Criteria
challengeType: 1
videoUrl: ''
localeTitle: 'Используйте каждый метод для проверки того, что каждый элемент в массиве соответствует критерию'
forumTopicId: 301312
localeTitle: Используйте каждый метод для проверки того, что каждый элемент в массиве соответствует критерию
---
## Description
<section id="description"> <code>every</code> метод работает с массивами, чтобы проверить, прошел ли <em>каждый</em> элемент конкретного теста. Он возвращает логическое значение - <code>true</code> если все значения соответствуют критериям, <code>false</code> если нет. Например, следующий код будет проверять, если каждый элемент массива <code>numbers</code> меньше 10: <blockquote> var numbers = [1, 5, 8, 0, 10, 11]; <br> numbers.every (function (currentValue) { <br> return currentValue &lt;10; <br> }); <br> // Возвращает false </blockquote></section>
<section id='description'>
<code>every</code> метод работает с массивами, чтобы проверить, прошел ли <em>каждый</em> элемент конкретного теста. Он возвращает логическое значение - <code>true</code> если все значения соответствуют критериям, <code>false</code> если нет. Например, следующий код будет проверять, если каждый элемент массива <code>numbers</code> меньше 10: <blockquote> var numbers = [1, 5, 8, 0, 10, 11]; <br> numbers.every (function (currentValue) { <br> return currentValue &lt;10; <br> }); <br> // Возвращает false </blockquote>
</section>
## Instructions
<section id="instructions"> Используйте <code>every</code> метод внутри функции <code>checkPositive</code> чтобы проверить, является ли каждый элемент в <code>arr</code> положительным. Функция должна возвращать логическое значение. </section>
<section id='instructions'>
Используйте <code>every</code> метод внутри функции <code>checkPositive</code> чтобы проверить, является ли каждый элемент в <code>arr</code> положительным. Функция должна возвращать логическое значение.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Ваш код должен использовать <code>every</code> метод.
testString: 'assert(code.match(/\.every/g), "Your code should use the <code>every</code> method.");'
- text: '<code>checkPositive([1, 2, 3, -4, 5])</code> должен возвращать <code>false</code> .'
testString: 'assert(!checkPositive([1, 2, 3, -4, 5]), "<code>checkPositive([1, 2, 3, -4, 5])</code> should return <code>false</code>.");'
- text: '<code>checkPositive([1, 2, 3, 4, 5])</code> должен возвращать <code>true</code> .'
testString: 'assert(checkPositive([1, 2, 3, 4, 5]), "<code>checkPositive([1, 2, 3, 4, 5])</code> should return <code>true</code>.");'
- text: '<code>checkPositive([1, -2, 3, -4, 5])</code> должен возвращать <code>false</code> .'
testString: 'assert(!checkPositive([1, -2, 3, -4, 5]), "<code>checkPositive([1, -2, 3, -4, 5])</code> should return <code>false</code>.");'
- text: Your code should use the <code>every</code> method.
testString: assert(code.match(/\.every/g));
- text: <code>checkPositive([1, 2, 3, -4, 5])</code> should return <code>false</code>.
testString: assert.isFalse(checkPositive([1, 2, 3, -4, 5]));
- text: <code>checkPositive([1, 2, 3, 4, 5])</code> should return <code>true</code>.
testString: assert.isTrue(checkPositive([1, 2, 3, 4, 5]));
- text: <code>checkPositive([1, -2, 3, -4, 5])</code> should return <code>false</code>.
testString: assert.isFalse(checkPositive([1, -2, 3, -4, 5]));
```
@ -48,14 +52,18 @@ checkPositive([1, 2, 3, -4, 5]);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
function checkPositive(arr) {
// Add your code below this line
return arr.every(num => num > 0);
// Add your code above this line
}
checkPositive([1, 2, 3, -4, 5]);
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7b8f367417b2b2512b63
title: Use the filter Method to Extract Data from an Array
challengeType: 1
videoUrl: ''
forumTopicId: 18179
localeTitle: Использовать фильтр Метод извлечения данных из массива
---
## Description
<section id="description"> Другая полезная функция массива - <code>Array.prototype.filter()</code> или просто <code>filter()</code> . Метод <code>filter</code> возвращает новый массив, который не больше, чем исходный массив, но обычно имеет меньше элементов. <code>Filter</code> не изменяет исходный массив, как <code>map</code> . Он выполняет функцию обратного вызова, которая применяет логику внутри обратного вызова для каждого элемента массива. Если элемент возвращает true на основе критериев в функции обратного вызова, он включается в новый массив. </section>
<section id='description'>
Другая полезная функция массива - <code>Array.prototype.filter()</code> или просто <code>filter()</code> . Метод <code>filter</code> возвращает новый массив, который не больше, чем исходный массив, но обычно имеет меньше элементов. <code>Filter</code> не изменяет исходный массив, как <code>map</code> . Он выполняет функцию обратного вызова, которая применяет логику внутри обратного вызова для каждого элемента массива. Если элемент возвращает true на основе критериев в функции обратного вызова, он включается в новый массив.
</section>
## Instructions
<section id="instructions"> Переменная <code>watchList</code> содержит массив объектов с информацией о нескольких фильмах. Используйте комбинацию <code>filter</code> и <code>map</code> чтобы вернуть новый массив объектов только с <code>title</code> и ключами <code>rating</code> , но где <code>imdbRating</code> больше или равно 8.0. Обратите внимание, что значения рейтинга сохраняются как строки в объекте, и вы можете преобразовать их в числа для выполнения математических операций над ними. </section>
<section id='instructions'>
Переменная <code>watchList</code> содержит массив объектов с информацией о нескольких фильмах. Используйте комбинацию <code>filter</code> и <code>map</code> чтобы вернуть новый массив объектов только с <code>title</code> и ключами <code>rating</code> , но где <code>imdbRating</code> больше или равно 8.0. Обратите внимание, что значения рейтинга сохраняются как строки в объекте, и вы можете преобразовать их в числа для выполнения математических операций над ними.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Переменная <code>watchList</code> не должна изменяться.
testString: 'assert(watchList[0].Title === "Inception" && watchList[4].Director == "James Cameron", "The <code>watchList</code> variable should not change.");'
- text: Ваш код должен использовать метод <code>filter</code> .
testString: 'assert(code.match(/\.filter/g), "Your code should use the <code>filter</code> method.");'
- text: Ваш код не должен использовать цикл <code>for</code> .
testString: 'assert(!code.match(/for\s*?\(.+?\)/g), "Your code should not use a <code>for</code> loop.");'
- text: '<code>filteredList</code> должен равняться <code>[{&quot;title&quot;: &quot;Inception&quot;,&quot;rating&quot;: &quot;8.8&quot;},{&quot;title&quot;: &quot;Interstellar&quot;,&quot;rating&quot;: &quot;8.6&quot;},{&quot;title&quot;: &quot;The Dark Knight&quot;,&quot;rating&quot;: &quot;9.0&quot;},{&quot;title&quot;: &quot;Batman Begins&quot;,&quot;rating&quot;: &quot;8.3&quot;}]</code> .'
testString: 'assert.deepEqual(filteredList, [{"title": "Inception","rating": "8.8"},{"title": "Interstellar","rating": "8.6"},{"title": "The Dark Knight","rating": "9.0"},{"title": "Batman Begins","rating": "8.3"}], "<code>filteredList</code> should equal <code>[{"title": "Inception","rating": "8.8"},{"title": "Interstellar","rating": "8.6"},{"title": "The Dark Knight","rating": "9.0"},{"title": "Batman Begins","rating": "8.3"}]</code>.");'
- text: The <code>watchList</code> variable should not change.
testString: assert(watchList[0].Title === "Inception" && watchList[4].Director == "James Cameron");
- text: Your code should use the <code>filter</code> method.
testString: assert(code.match(/\.filter/g));
- text: Your code should not use a <code>for</code> loop.
testString: assert(!code.match(/for\s*?\(.+?\)/g));
- text: '<code>filteredList</code> should equal <code>[{"title": "Inception","rating": "8.8"},{"title": "Interstellar","rating": "8.6"},{"title": "The Dark Knight","rating": "9.0"},{"title": "Batman Begins","rating": "8.3"}]</code>.'
testString: 'assert.deepEqual(filteredList, [{"title": "Inception","rating": "8.8"},{"title": "Interstellar","rating": "8.6"},{"title": "The Dark Knight","rating": "9.0"},{"title": "Batman Begins","rating": "8.3"}]);'
```
@ -162,14 +166,128 @@ console.log(filteredList);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
// 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
let filteredList = watchList.filter(e => e.imdbRating >= 8).map( ({Title: title, imdbRating: rating}) => ({title, rating}) );
// Add your code above this line
```
</section>

View File

@ -2,29 +2,33 @@
id: 587d7b8f367417b2b2512b61
title: Use the map Method to Extract Data from an Array
challengeType: 1
videoUrl: ''
forumTopicId: 18214
localeTitle: Используйте метод «Карта» для извлечения данных из массива
---
## Description
<section id="description"> До сих пор мы научились использовать чистые функции, чтобы избежать побочных эффектов в программе. Кроме того, мы видели, что значение наличия функции зависит только от ее входных аргументов. Это только начало. Как следует из названия, функциональное программирование сосредоточено вокруг теории функций. Было бы разумно иметь возможность передавать их в качестве аргументов другим функциям и возвращать функцию из другой функции. Функции считаются <code>First Class Objects</code> в JavaScript, что означает, что они могут использоваться как любой другой объект. Они могут быть сохранены в переменных, сохранены в объекте или переданы как аргументы функции. Начнем с некоторых простых функций массива, которые являются методами прототипа объекта массива. В этом упражнении мы смотрим на <code>Array.prototype.map()</code> или более просто на <code>map</code> . Помните, что метод <code>map</code> - это способ перебора каждого элемента в массиве. Он создает новый массив (без изменения исходного) после применения функции обратного вызова для каждого элемента. </section>
<section id='description'>
До сих пор мы научились использовать чистые функции, чтобы избежать побочных эффектов в программе. Кроме того, мы видели, что значение наличия функции зависит только от ее входных аргументов. Это только начало. Как следует из названия, функциональное программирование сосредоточено вокруг теории функций. Было бы разумно иметь возможность передавать их в качестве аргументов другим функциям и возвращать функцию из другой функции. Функции считаются <code>First Class Objects</code> в JavaScript, что означает, что они могут использоваться как любой другой объект. Они могут быть сохранены в переменных, сохранены в объекте или переданы как аргументы функции. Начнем с некоторых простых функций массива, которые являются методами прототипа объекта массива. В этом упражнении мы смотрим на <code>Array.prototype.map()</code> или более просто на <code>map</code> . Помните, что метод <code>map</code> - это способ перебора каждого элемента в массиве. Он создает новый массив (без изменения исходного) после применения функции обратного вызова для каждого элемента.
</section>
## Instructions
<section id="instructions"> В массиве <code>watchList</code> хранятся объекты с информацией о нескольких фильмах. Используйте <code>map</code> чтобы вытащить заголовок и рейтинг из <code>watchList</code> и сохранить новый массив в переменной <code>rating</code> . Код в редакторе в настоящее время использует цикл <code>for</code> для этого, замените функциональность цикла на ваше выражение <code>map</code> . </section>
<section id='instructions'>
В массиве <code>watchList</code> хранятся объекты с информацией о нескольких фильмах. Используйте <code>map</code> чтобы вытащить заголовок и рейтинг из <code>watchList</code> и сохранить новый массив в переменной <code>rating</code> . Код в редакторе в настоящее время использует цикл <code>for</code> для этого, замените функциональность цикла на ваше выражение <code>map</code> .
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: Переменная <code>watchList</code> не должна изменяться.
testString: 'assert(watchList[0].Title === "Inception" && watchList[4].Director == "James Cameron", "The <code>watchList</code> variable should not change.");'
- text: Ваш код не должен использовать цикл <code>for</code> .
testString: 'assert(!code.match(/for\s*?\(.+?\)/g), "Your code should not use a <code>for</code> loop.");'
- text: Ваш код должен использовать метод <code>map</code> .
testString: 'assert(code.match(/\.map/g), "Your code should use the <code>map</code> method.");'
- text: '<code>rating</code> должен быть равен <code>[{&quot;title&quot;:&quot;Inception&quot;,&quot;rating&quot;:&quot;8.8&quot;},{&quot;title&quot;:&quot;Interstellar&quot;,&quot;rating&quot;:&quot;8.6&quot;},{&quot;title&quot;:&quot;The Dark Knight&quot;,&quot;rating&quot;:&quot;9.0&quot;},{&quot;title&quot;:&quot;Batman Begins&quot;,&quot;rating&quot;:&quot;8.3&quot;},{&quot;title&quot;:&quot;Avatar&quot;,&quot;rating&quot;:&quot;7.9&quot;}]</code> .'
testString: 'assert(JSON.stringify(rating) === JSON.stringify([{"title":"Inception","rating":"8.8"},{"title":"Interstellar","rating":"8.6"},{"title":"The Dark Knight","rating":"9.0"},{"title":"Batman Begins","rating":"8.3"},{"title":"Avatar","rating":"7.9"}]), "<code>rating</code> should equal <code>[{"title":"Inception","rating":"8.8"},{"title":"Interstellar","rating":"8.6"},{"title":"The Dark Knight","rating":"9.0"},{"title":"Batman Begins","rating":"8.3"},{"title":"Avatar","rating":"7.9"}]</code>.");'
- text: The <code>watchList</code> variable should not change.
testString: assert(watchList[0].Title === "Inception" && watchList[4].Director == "James Cameron");
- text: Your code should not use a <code>for</code> loop.
testString: assert(!removeJSComments(code).match(/for\s*?\(.*?\)/));
- text: Your code should use the <code>map</code> method.
testString: assert(code.match(/\.map/g));
- text: <code>rating</code> should equal <code>[{"title":"Inception","rating":"8.8"},{"title":"Interstellar","rating":"8.6"},{"title":"The Dark Knight","rating":"9.0"},{"title":"Batman Begins","rating":"8.3"},{"title":"Avatar","rating":"7.9"}]</code>.
testString: assert(JSON.stringify(rating) === JSON.stringify([{"title":"Inception","rating":"8.8"},{"title":"Interstellar","rating":"8.6"},{"title":"The Dark Knight","rating":"9.0"},{"title":"Batman Begins","rating":"8.3"},{"title":"Avatar","rating":"7.9"}]));
```
@ -159,13 +163,21 @@ for(var i=0; i < watchList.length; i++){
// Add your code above this line
console.log(rating);
console.log(JSON.stringify(rating));
```
</div>
### After Tests
<div id='js-teardown'>
```js
const removeJSComments = str => str.replace(/\/\*[\s\S]*?\*\/|\/\/.*$/gm, '');
```
</div>
</section>
@ -173,6 +185,126 @@ console.log(rating);
<section id='solution'>
```js
// solution required
// 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"
}
];
var rating = watchList.map(function(movie) {
return {
title: movie["Title"],
rating: movie["imdbRating"]
}
});
```
</section>

View File

@ -2,35 +2,41 @@
id: 587d7da9367417b2b2512b68
title: Use the reduce Method to Analyze Data
challengeType: 1
videoUrl: ''
forumTopicId: 301313
localeTitle: Используйте метод reduce для анализа данных
---
## Описание
<section id="description"> <code>Array.prototype.reduce()</code> или просто <code>reduce()</code>, является наиболее общей из всех операций с массивами в JavaScript. Вы можете решить практически любую проблему обработки массива с помощью метода <code>reduce</code> . Это не относится к методам <code>filter</code> и <code>map</code> поскольку они не позволяют взаимодействовать между двумя различными элементами массива. Например, если вы хотите сравнить элементы массива или добавить их вместе, <code>filter</code> или <code>map</code> не смогут обработать это. Метод <code>reduce</code> позволяет использовать более общие формы обработки массивов, и можно показать, что как <code>filter</code>, так и <code>map</code> могут быть реализованы через <code>reduce</code>. Однако, прежде чем мы перейдем к этому, давайте сначала научимся использовать <code>reduce</code>. </section>
## Description
<section id='description'>
<code>Array.prototype.reduce()</code> или просто <code>reduce()</code>, является наиболее общей из всех операций с массивами в JavaScript. Вы можете решить практически любую проблему обработки массива с помощью метода <code>reduce</code> . Это не относится к методам <code>filter</code> и <code>map</code> поскольку они не позволяют взаимодействовать между двумя различными элементами массива. Например, если вы хотите сравнить элементы массива или добавить их вместе, <code>filter</code> или <code>map</code> не смогут обработать это. Метод <code>reduce</code> позволяет использовать более общие формы обработки массивов, и можно показать, что как <code>filter</code>, так и <code>map</code> могут быть реализованы через <code>reduce</code>. Однако, прежде чем мы перейдем к этому, давайте сначала научимся использовать <code>reduce</code>.
</section>
## Указания
<section id="instructions"> Переменная <code>watchList</code> содержит массив объектов с информацией о нескольких фильмах. Используйте <code>reduce</code> чтобы найти средний рейтинг IMDB фильмов <strong>режиссера Кристофера Нолана</strong>. Вспомните предыдущие задачи, как применять к данным <code>filter</code> и <code>map</code>, чтобы вытащить то, что вам нужно. Возможно, вам придется создавать другие переменные, но сохранить окончательное среднее значение в переменной <code>averageRating</code>. Обратите внимание, что значения рейтинга сохраняются как строки в объекте и должны быть преобразованы в числа, прежде чем они будут использоваться в любых математических операциях. </section>
## Instructions
<section id='instructions'>
Переменная <code>watchList</code> содержит массив объектов с информацией о нескольких фильмах. Используйте <code>reduce</code> чтобы найти средний рейтинг IMDB фильмов <strong>режиссера Кристофера Нолана</strong>. Вспомните предыдущие задачи, как применять к данным <code>filter</code> и <code>map</code>, чтобы вытащить то, что вам нужно. Возможно, вам придется создавать другие переменные, но сохранить окончательное среднее значение в переменной <code>averageRating</code>. Обратите внимание, что значения рейтинга сохраняются как строки в объекте и должны быть преобразованы в числа, прежде чем они будут использоваться в любых математических операциях.
</section>
## Тесты
## Tests
<section id='tests'>
```yml
tests:
- text: Переменная <code>watchList</code> не должна изменяться.
testString: 'assert(watchList[0].Title === "Inception" && watchList[4].Director == "James Cameron", "The <code>watchList</code> variable should not change.");'
- text: Ваш код должен использовать метод <code>reduce</code>.
testString: 'assert(code.match(/\.reduce/g), "Your code should use the <code>reduce</code> method.");'
- text: <code>averageRating</code> должно равняться 8.675.
testString: 'assert(averageRating == 8.675, "The <code>averageRating</code> should equal 8.675.");'
- text: Ваш код не должен использовать цикл <code>for</code>.
testString: 'assert(!code.match(/for\s*?\(.*\)/g), "Your code should not use a <code>for</code> loop.");'
- text: The <code>watchList</code> variable should not change.
testString: assert(watchList[0].Title === "Inception" && watchList[4].Director == "James Cameron");
- text: Your code should use the <code>reduce</code> method.
testString: assert(code.match(/\.reduce/g));
- text: The <code>getRating(watchList)</code> should equal 8.675.
testString: assert(getRating(watchList) === 8.675);
- text: Your code should not use a <code>for</code> loop.
testString: assert(!code.match(/for\s*?\(.*\)/g));
- text: Your code should return correct output after modifying the <code>watchList</code> object.
testString: assert(getRating(watchList.filter((_, i) => i < 1 || i > 2)) === 8.55);
```
</section>
## Исходные данные
## Challenge Seed
<section id='challengeSeed'>
<div id='js-seed'>
@ -150,26 +156,148 @@ var watchList = [
}
];
// Add your code below this line
function getRating(watchList){
// Add your code below this line
var averageRating;
var averageRating;
// Add your code above this line
console.log(averageRating);
// Add your code above this line
return averageRating;
}
console.log(getRating(watchList));
```
</div>
</section>
## Решение
## Solution
<section id='solution'>
```js
// solution required
// 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){
var 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;
}
```
</section>

View File

@ -2,29 +2,43 @@
id: 587d7dab367417b2b2512b6f
title: Use the some Method to Check that Any Elements in an Array Meet a Criteria
challengeType: 1
videoUrl: ''
localeTitle: 'Используйте некоторый метод для проверки того, что любые элементы в массиве соответствуют критериям'
forumTopicId: 301314
localeTitle: Используйте некоторый метод для проверки того, что любые элементы в массиве соответствуют критериям
---
## Description
undefined
<section id='description'>
The <code>some</code> method works with arrays to check if <em>any</em> element passes a particular test. It returns a Boolean value - <code>true</code> if any of the values meet the criteria, <code>false</code> if not.
For example, the following code would check if any element in the <code>numbers</code> array is less than 10:
```js
var numbers = [10, 50, 8, 220, 110, 11];
numbers.some(function(currentValue) {
return currentValue < 10;
});
// Returns true
```
</section>
## Instructions
undefined
<section id='instructions'>
Use the <code>some</code> method inside the <code>checkPositive</code> function to check if any element in <code>arr</code> is positive. The function should return a Boolean value.
</section>
## Tests
<section id='tests'>
```yml
tests:
- text: ''
testString: 'assert(code.match(/\.some/g), "Your code should use the <code>some</code> method.");'
- text: ''
testString: 'assert(checkPositive([1, 2, 3, -4, 5]), "<code>checkPositive([1, 2, 3, -4, 5])</code> should return <code>true</code>.");'
- text: '<code>checkPositive([1, 2, 3, 4, 5])</code> должен возвращать <code>true</code> .'
testString: 'assert(checkPositive([1, 2, 3, 4, 5]), "<code>checkPositive([1, 2, 3, 4, 5])</code> should return <code>true</code>.");'
- text: ''
testString: 'assert(!checkPositive([-1, -2, -3, -4, -5]), "<code>checkPositive([-1, -2, -3, -4, -5])</code> should return <code>false</code>.");'
- text: Your code should use the <code>some</code> method.
testString: assert(code.match(/\.some/g));
- text: <code>checkPositive([1, 2, 3, -4, 5])</code> should return <code>true</code>.
testString: assert(checkPositive([1, 2, 3, -4, 5]));
- text: <code>checkPositive([1, 2, 3, 4, 5])</code> should return <code>true</code>.
testString: assert(checkPositive([1, 2, 3, 4, 5]));
- text: <code>checkPositive([-1, -2, -3, -4, -5])</code> should return <code>false</code>.
testString: assert(!checkPositive([-1, -2, -3, -4, -5]));
```
@ -48,14 +62,18 @@ checkPositive([1, 2, 3, -4, 5]);
</div>
</section>
## Solution
<section id='solution'>
```js
// solution required
function checkPositive(arr) {
// Add your code below this line
return arr.some(elem => elem > 0);
// Add your code above this line
}
checkPositive([1, 2, 3, -4, 5]);
```
</section>