Функциональное программирование становится все более популярным. Такая парадигма поддерживается достаточно известным и распространенным языком – JavaScript. Нужен JS для того, чтобы создавать веб-приложения, а также иное программное обеспечение, базирующееся на скриптах. В основном применяется для интернет-разработки.
Функциональное программирование имеет одну особенность – использование списков, а также разнообразных операторов для работы с ними. Говоря проще – массивы вещей и возможность взаимодействия с ними.
В данной статье будут рассмотрены ключевые операторы списков в JavaScript. Они помогут быстрее создавать функциональные коды, получая на выходе достаточно мощные утилиты. А еще – позволят избавиться от постоянного применения цикла for.
Оператор Map
При создании ПО приходится достаточно часто модифицировать каждый элемент имеющегося массива при помощи одних и тех же подходов. Типичные примеры – возведение каждого компонента массива чисел в квадрат, получение имен из списка пользователей, обработка строк регулярными выражениями.
Map – встроенный метод JS, который используется для соответствующих задач. Он определен в Array.prototype. Его можно вызвать на любом массиве, а затем передать коллбек в виде первого аргумента.
При вызове map для массива, callback выполняется для каждого его элемента. После – возвращается новый массив со значениями, которые обработаны каллбеком.
Данная функция (оператор) передает три аргумента:
- текущий элемент массива;
- индекс;
- весь массив, для которого был вызван изначально map.
Лучше разобраться с этими моментами JavaScript помогут наглядные примеры.
Практическое применение
Надо сделать программу, которая имеет массив с задачами для выполнения на день. Каждый task – это объект. Он имеет свои собственные свойства name и duration. В редакторе фрагмент кода выглядит так:
Теперь требуется создать новый массив только с «именем» для каждого «таска». Этот прием позволяет посмотреть на все задачи, выполненные за день. Необходимо использовать цикл for. Тогда код будет выглядеть так:
В JS есть цикл forEach. Он работает так же, как и for, но в нем не требуется проводить сравнение индекса элемента с длиной массива. Процессы проводятся автоматически:
Если же нужно использовать «метод» map, код получит следующее представление:
Здесь добавлены параметры index и array. Это поможет не забыть о том, что ими можно пользоваться при необходимости. А вот – реализация на MDN:
Перед тем, как его протестировать, нужно инициализировать task. Отлично работает с mdn MozillaFirefox.
Разница между подходами
Программист может использовать любой метод из предложенных. Главное – понимать разницу между ними:
- Map нужен для того, чтобы избавиться от состояния цикла for.
- Позволяет взаимодействовать с компонентами массива напрямую. Индексировать его не придется.
- Не придется создавать массив пустой и добавлять в него компоненты. Map вернет конечный результат за один подход. Останется добавить возвращаемое значение новой переменной.
- Нужно не забывать добавлять return коллбеку. Если им пренебречь, на выходе получится новый массив, который заполнен undefined.
Все эти характеристики имеют иные рассматриваемые далее функции. Map имеет несколько преимуществ перед forEach:
- ForEach возвращает undefined. Его не получится связать с другими методами массива. Map от этого недостатка уберегает.
- Функция (оператор) Map поможет вернуть массив с конечным результатом. Корректировать «набор данных» внутри цикла больше нет необходимости.
Все это приводит к тому, что функциональный код становится максимально емким, понятным и простым. Это – верный путь к реактивной разработке.
О трудностях
В коллбеке, передаваемом оператору, должен быть явный return. В противном случае функция вернет массив, который принимает компоненты типа undefined.
Также стоит запомнить – данный вариант не указывает на ошибки. Вместо этого происходит возврат пустого массива. Тихие ошибки подобного плана достаточно тяжело искать, особенно если исходный код объемный.
Метод Filter
Основные methods для работы со списками в функциональном программировании на JS предусматривают метод Filter. Он отвечает за фильтрацию массива. Отсеивает ненужные компоненты.
Определяется в array prototype. Method доступен для любого массива. Начальное значение (аргумент) – каллбек. Работает так:
- Filter вызывает callback для каждого компонента «множества данных».
- Проводится обработка информации.
- Возвращается новый массив, который содержит только компоненты, для которых callback вернул значение «истина».
Передает при работе три аргумента: текущий компонент, индекс и весь массив.
Проблемы реализации
Каждый раз, когда разработчик использует Filter, он должен помнить, что:
- Обязательно использовать return. Это нужно для того, чтобы убедиться в возврате булевого значения.
- Если забыть о return, коллбек вернет undefined. Результат метода всегда будет «ложью».
- Если возвращается что-то, что отличается от «истины» и «лжи», система использует правила приведения JS. Это помогает понять, чего хочет добиться разработчик. Это часто влечет ошибки.
Запомнив эти простые правила и принципы того, как работает Filter, программист сможет эффективно использовать его в функциональном программировании.
Метод reduce
Reduce – метод массива, позволяющий превращать «множество данных» в любое другое значение при помощи переданной функции коллбека и начального значения. Используется тогда, когда есть массив чисел, которые необходимо сложить.
Reduce – к первому значению прибавляет второе, потом к результату – третье и так далее. Это – аналог «суммы» (sum). Определяется в array prototype. Доступен для любого массива. Коллбек передается в виде первого аргумента. Дополнительно можно передать второй аргумент – значение, индекс с которого предусматривает сложение.
Имеет четыре arg:
- текущее значение (acc);
- предыдущее значение (item);
- нынешний индекс (index);
- массив, для которого вызывается reduce (arr).
Callback будет иметь доступ к предыдущим «параметрам» на каждой очередной итерации. На первом «проходе» его нет. Именно поэтому reduce требует передачи начального «параметра» на усмотрение пользователя. В противном случае предыдущее окажется 0. Reduce в JavaScript возвращает один arr (arg), а не все «множество» из одной составляющей.
Наглядный пример
Соответствующий метод встречается на практике чаще остальных. Поэтому его стоит рассмотреть более подробно. Вот – пример кода:
Так будет выглядеть reduce на практике.
Особенности написания
Reduce принимает два параметра object – функцию-коллбек и начальный arr-параметр для аккумулятора.
Операция обязательно возвращает тот или иной результат. Связно это с тем, что при следующей итерации в acc object отобразится результат, который вернулся на предыдущем этапе. На начале обработки первый элемент – это «параметр», который передается вторым из arr в метод reduce.
«Точку старта» для аккумулятора можно не указывать явно. Для этого случае первый компонент в arr встречается на первой итерации:
В этом example:
- Acc на первом проходе – это «единица», val – 2.
- К полученному результату objects прибавляется 3.
- Осуществляется возврат результата через reduce.
Есть и краевой example. Если arr пуст, JS выдаст соответствующую ошибку с сообщением «Reduce of empty arrays with no initial value. Ситуация требует отдельной обработки. Example – обернуть reduce в try…catch. Но лучше всегда задавать function «изначальный параметр».
Применение на практике
Reduce – это object (функция), которая широко распространена в функциональном программировании. Особенно на JS. Далее будут рассмотрены ситуации, при которых нужен соответствующий метод. Все это поможет лучше разобраться в принципах его работы.
ES5 версия
При работе с node и mdn код может выглядеть громоздко. Часто программисты начинают с ES5. Элементарный код будет выглядеть так:
Остальные примеры – это ES6. Его синтаксис более краткий и оставляет меньше пространства для возникновения тех или иных ошибок.
Среднее число
In order требуется не просто вывести сумму, а разделить ее на длину arr перед тем, как отображать итог. Для этого можно задействовать index. Он покажет, сколько раз редюсер прошел по «множеству».
Последний «параметр» — это и его сам arr. Выше – пример обнаружения среднего заданных объектов.
Учет данных
А вот order, который помогает вести учет информации через reduce. Он помогает if есть коллекция информации, но требуется узнать, сколько типов каждого компонента содержится во множестве:
Чтобы посчитать каждый объект в arr, требуется сначала задать пустой object, а не все множество. Далее действовать необходимо следующим образом:
- Сохранить пару ключ-значение в total: .
- Выдать имя первому ключу. Это – первый параметр.
- Присваиваемое значение – «единица». Такой подход позволяет получить объект, где все названия фруктов – это ключи. Каждый имеет значение 1.
- Увеличение length (параметра каждого «фрукта») необходимо, если происходит повторение.
- На втором цикле требуется проверить, есть ли в total ключ с соответствующей «пищей». Если нет – создать ключ. В противном случае – увеличить на +1: .
Теперь можно запустить программу и посмотреть, что вышло. Пример – через node.
Соединение воедино
Reduce помогает сливать друг с другом вложенные значения. Они in order обретают форму единого arr (множества). Выглядит это так:
- Сначала нужно выставить изначальное значение на пустое множество. Далее – конкатенировать его с total: .
- Для более сложной ситуации – получить все цвета с переменной data, которая находится ниже: .
- Пройтись по каждому объекту (push) и взять оттуда нужные цвета. Для этого на помощь придет reduce. Но можно воспользоваться forEach и использовать amount.c. При каждой итерации здесь происходит добавление вложенного arr в total: .
- Если нужно только уникальные «параметры», требуется провести проверку на него в total. Делается это перед тем, как отправить соответствующий компонент в arr: .
Это – основы работы со списками и уникальными функциями JS. Освоить их сможет как новичок, так и продвинутый разработчик. Наглядные примеры помогут не запутаться и лучше разобраться в выбранном направлении.
Курсы для быстрого освоения
Чтобы лучше изучить метод reduce в JavaScript, а также выяснить, что такое node и функциональное программирование, подойдут специализированные компьютерные курсы. Они намного лучше самообразования.
Рассчитаны программы на срок от нескольких месяцев до года. Пользователи могут выбрать одно или пару направлений одновременно. Каждому гарантировано кураторство опытными специалистами, интересные домашние задания и практика с формированием портфолио. При успешном завершении курсов пользователь получит сертификат, подтверждающий навыки и умения в выбранной области.
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Операторы списков в JS OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Функциональное программирование становится все более популярным. Такая парадигма поддерживается достаточно известным и распространенным языком – JavaScript. Нужен JS для того, чтобы создавать веб-приложения, а также иное программное обеспечение, базирующееся на скриптах. В основном применяется для интернет-разработки. Функциональное программирование имеет одну особенность – использование списков, а также разнообразных операторов для работы с ними. Говоря проще –" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/operatory-spiskov-v-js/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#article","name":"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 JS OTUS","headline":"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 JS","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2022\/09\/oj-1080x720-8-1.png","width":1080,"height":720},"datePublished":"2022-09-27T18:49:25+00:00","dateModified":"2022-09-27T18:49:27+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#listItem","position":2,"name":"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 JS","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#webpage","url":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/","name":"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u0432 JS OTUS","description":"\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0435 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c. \u0422\u0430\u043a\u0430\u044f \u043f\u0430\u0440\u0430\u0434\u0438\u0433\u043c\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u043c \u0438 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u044f\u0437\u044b\u043a\u043e\u043c \u2013 JavaScript. \u041d\u0443\u0436\u0435\u043d JS \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u0431\u0430\u0437\u0438\u0440\u0443\u044e\u0449\u0435\u0435\u0441\u044f \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445. \u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u043e\u0434\u043d\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u2013 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u0413\u043e\u0432\u043e\u0440\u044f \u043f\u0440\u043e\u0449\u0435 \u2013","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2022\/09\/oj-1080x720-8-1.png","@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#mainImage","width":1080,"height":720},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/operatory-spiskov-v-js\/#mainImage"},"datePublished":"2022-09-27T18:49:25+00:00","dateModified":"2022-09-27T18:49:27+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/4666" /><link rel='shortlink' href='https://otus.ru/journal/?p=4666' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Foperatory-spiskov-v-js%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Foperatory-spiskov-v-js%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-4666 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-4666" class="the-post post-4666 post type-post status-publish format-standard has-post-thumbnail category-polza tag-javascript">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Операторы списков в JS
</h1>
<a href="https://otus.ru/journal/operatory-spiskov-v-js/" class="date-link" data-wpel-link="internal"><time class="post-date">27 сентября, 2022</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1.png" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Операторы списков в JS" title="Операторы списков в JS" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1-270x180.png 270w" data-src="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-8-1-770x515.png" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_Map" title="Оператор Map">Оператор Map</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5" title="Практическое применение">Практическое применение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8" title="Разница между подходами">Разница между подходами</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9E_%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D1%85" title="О трудностях">О трудностях</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_Filter" title="Метод Filter">Метод Filter</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8" title="Проблемы реализации">Проблемы реализации</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_reduce" title="Метод reduce">Метод reduce</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80" title="Наглядный пример">Наглядный пример</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F" title="Особенности написания">Особенности написания</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B5" title="Применение на практике">Применение на практике</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-11" href="#ES5_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F" title="ES5 версия">ES5 версия</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE" title="Среднее число">Среднее число</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%A3%D1%87%D0%B5%D1%82_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85" title="Учет данных">Учет данных</a></li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%A1%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%BE" title="Соединение воедино">Соединение воедино</a></li></ul></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%9A%D1%83%D1%80%D1%81%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%BE%D1%81%D0%B2%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F" title="Курсы для быстрого освоения">Курсы для быстрого освоения</a></li></ul></nav></div>
<p>Функциональное программирование становится все более популярным. Такая парадигма поддерживается достаточно известным и распространенным языком – JavaScript. Нужен JS для того, чтобы создавать веб-приложения, а также иное программное обеспечение, базирующееся на скриптах. В основном применяется для интернет-разработки.</p>
<p>Функциональное программирование имеет одну особенность – использование списков, а также разнообразных операторов для работы с ними. Говоря проще – массивы вещей и возможность взаимодействия с ними.</p>
<p>В данной статье будут рассмотрены ключевые операторы списков в JavaScript. Они помогут быстрее создавать функциональные коды, получая на выходе достаточно мощные утилиты. А еще – позволят избавиться от постоянного применения цикла for.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80_Map"></span>Оператор Map<span class="ez-toc-section-end"></span></h2>
<p>При создании ПО приходится достаточно часто модифицировать каждый элемент имеющегося массива при помощи одних и тех же подходов. Типичные примеры – возведение каждого компонента массива чисел в квадрат, получение имен из списка пользователей, обработка строк регулярными выражениями.</p>
<p>Map – встроенный метод JS, который используется для соответствующих задач. Он определен в Array.prototype. Его можно вызвать на любом массиве, а затем передать коллбек в виде первого аргумента.</p>
<p>При вызове map для массива, callback выполняется для каждого его элемента. После – возвращается новый массив со значениями, которые обработаны каллбеком.</p>
<p>Данная функция (оператор) передает три аргумента:</p>
<ul><li>текущий элемент массива;</li><li>индекс;</li><li>весь массив, для которого был вызван изначально map.</li></ul>
<p>Лучше разобраться с этими моментами JavaScript помогут наглядные примеры.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5"></span>Практическое применение<span class="ez-toc-section-end"></span></h3>
<p>Надо сделать программу, которая имеет массив с задачами для выполнения на день. Каждый task – это объект. Он имеет свои собственные свойства name и duration. В редакторе фрагмент кода выглядит так:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/D7VERQYNXwfFxigeNhcz3IODwdQ06Wn2mi0njX6M5ysu0Yu0Ou1es52TCwBm0XODMf4yxsD-lU6Fw523YTicnMFDCov4ZBmuTNyoc5EtutLpmEwSAIpoJChp9QkJ2Fm0dGpK8E-MsXmd-nQIKpvndde73jTLsdzOX6M17sLaUo_W79vtAdIu-yj_hERm89X4SleA8g" alt="Операторы списков в JS"/></figure>
<p>Теперь требуется создать новый массив только с «именем» для каждого «таска». Этот прием позволяет посмотреть на все задачи, выполненные за день. Необходимо использовать цикл for. Тогда код будет выглядеть так:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/saeyTzA6sD1CMpi9-mYHrENS7AJUbyJtHf_suECQDwalh_wM-j56yLdU9bTgHUPtjFHNMtioBNnvZmyZ_R6shaWz9LtGYuiCTJaGD9ddI3XzAqR-XLk9QpTyf5Trl4f6ZqAC94D58EuC3cWU08aVekfWLpXwudo-foWiykN5dTZaRWCmRYg8bXJykvjoV3fDZpjwSA" alt="Операторы списков в JS"/></figure>
<p>В JS есть цикл forEach. Он работает так же, как и for, но в нем не требуется проводить сравнение индекса элемента с длиной массива. Процессы проводятся автоматически:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/8bBukVPIDrauTjJ3hg0SMq_LurKXywlPHTLBf8yjeUBJY2NBw73AFkO4Q6OufpurBSdYvbvZKhAj4NzoB8eqOi5gsgm3SZyZeoH_7tF5vo-X0UO4QkqJDX6OhUobn46GBkYguT3esEpEf39kIpjQfh6-MtVGd4DmzlXg436JY7wHOKBx46DfDTKKrq7Phmj4IOXbMg" alt="Операторы списков в JS"/></figure>
<p>Если же нужно использовать «метод» map, код получит следующее представление:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/m89ru___l6saEVfV9Ezt-utYqRPClEQT2Tr_fPPGZ690LqOtn1O6j6FnnA2nR672E3HtlJde1kd0cvuuDHfY5nQ6_WMLUw3lubApmt0kcAH0tldViRmG9chz8wK89lczkNa1CzxSJeo6JKRZdctDYwphkqj7MgpCPte3_Thxy-XjK-cDeLKM6G2cOidV4z8TYLiAQw" alt="Операторы списков в JS"/></figure>
<p>Здесь добавлены параметры index и array. Это поможет не забыть о том, что ими можно пользоваться при необходимости. А вот – реализация на MDN:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/jOYtII2o_UjTKmIM-rAX_6qypP8FOKbDP8Robciew5S2d-E2Op61r6eK1Z15Aoe_ogzWXSBGQY9Z2r0NAVt3JbaxyQxcW3SjhCAzah-gWt9V-WzTt0RdXIlPGGkq4F85VYyE_4_2-B27bNOXeXt2SgivIaDy5kiKIrLxJouOID5Ix-Pl-d74t6LGVEst3y8wdvFIIw" alt="Операторы списков в JS"/></figure>
<p>Перед тем, как его протестировать, нужно инициализировать task. Отлично работает с mdn MozillaFirefox.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D0%BF%D0%BE%D0%B4%D1%85%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8"></span>Разница между подходами<span class="ez-toc-section-end"></span></h3>
<p>Программист может использовать любой метод из предложенных. Главное – понимать разницу между ними:</p>
<ol><li>Map нужен для того, чтобы избавиться от состояния цикла for.</li><li>Позволяет взаимодействовать с компонентами массива напрямую. Индексировать его не придется.</li><li>Не придется создавать массив пустой и добавлять в него компоненты. Map вернет конечный результат за один подход. Останется добавить возвращаемое значение новой переменной.</li><li>Нужно не забывать добавлять return коллбеку. Если им пренебречь, на выходе получится новый массив, который заполнен undefined.</li></ol>
<p>Все эти характеристики имеют иные рассматриваемые далее функции. Map имеет несколько преимуществ перед forEach:</p>
<ol><li>ForEach возвращает undefined. Его не получится связать с другими методами массива. Map от этого недостатка уберегает.</li><li>Функция (оператор) Map поможет вернуть массив с конечным результатом. Корректировать «набор данных» внутри цикла больше нет необходимости.</li></ol>
<p>Все это приводит к тому, что функциональный код становится максимально емким, понятным и простым. Это – верный путь к реактивной разработке.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E_%D1%82%D1%80%D1%83%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D1%85"></span>О трудностях<span class="ez-toc-section-end"></span></h3>
<p>В коллбеке, передаваемом оператору, должен быть явный return. В противном случае функция вернет массив, который принимает компоненты типа undefined.</p>
<p>Также стоит запомнить – данный вариант не указывает на ошибки. Вместо этого происходит возврат пустого массива. Тихие ошибки подобного плана достаточно тяжело искать, особенно если исходный код объемный.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_Filter"></span>Метод Filter<span class="ez-toc-section-end"></span></h2>
<p>Основные methods для работы со списками в функциональном программировании на JS предусматривают метод Filter. Он отвечает за фильтрацию массива. Отсеивает ненужные компоненты.</p>
<p>Определяется в array prototype. Method доступен для любого массива. Начальное значение (аргумент) – каллбек. Работает так:</p>
<ol><li>Filter вызывает callback для каждого компонента «множества данных».</li><li>Проводится обработка информации.</li><li>Возвращается новый массив, который содержит только компоненты, для которых callback вернул значение «истина».</li></ol>
<p>Передает при работе три аргумента: текущий компонент, индекс и весь массив.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"></span>Проблемы реализации<span class="ez-toc-section-end"></span></h3>
<p>Каждый раз, когда разработчик использует Filter, он должен помнить, что:</p>
<ol><li>Обязательно использовать return. Это нужно для того, чтобы убедиться в возврате булевого значения.</li><li>Если забыть о return, коллбек вернет undefined. Результат метода всегда будет «ложью».</li><li>Если возвращается что-то, что отличается от «истины» и «лжи», система использует правила приведения JS. Это помогает понять, чего хочет добиться разработчик. Это часто влечет ошибки.</li></ol>
<p>Запомнив эти простые правила и принципы того, как работает Filter, программист сможет эффективно использовать его в функциональном программировании.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%B5%D1%82%D0%BE%D0%B4_reduce"></span>Метод reduce<span class="ez-toc-section-end"></span></h2>
<p>Reduce – метод массива, позволяющий превращать «множество данных» в любое другое значение при помощи переданной функции коллбека и начального значения. Используется тогда, когда есть массив чисел, которые необходимо сложить.</p>
<p>Reduce – к первому значению прибавляет второе, потом к результату – третье и так далее. Это – аналог «суммы» (sum). Определяется в array prototype. Доступен для любого массива. Коллбек передается в виде первого аргумента. Дополнительно можно передать второй аргумент – значение, индекс с которого предусматривает сложение.</p>
<p>Имеет четыре arg:</p>
<ul><li>текущее значение (acc);</li><li>предыдущее значение (item);</li><li>нынешний индекс (index);</li><li>массив, для которого вызывается reduce (arr).</li></ul>
<p>Callback будет иметь доступ к предыдущим «параметрам» на каждой очередной итерации. На первом «проходе» его нет. Именно поэтому reduce требует передачи начального «параметра» на усмотрение пользователя. В противном случае предыдущее окажется 0. Reduce в JavaScript возвращает один arr (arg), а не все «множество» из одной составляющей.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B0%D0%B3%D0%BB%D1%8F%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80"></span>Наглядный пример<span class="ez-toc-section-end"></span></h3>
<p>Соответствующий метод встречается на практике чаще остальных. Поэтому его стоит рассмотреть более подробно. Вот – пример кода:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-x0tr_ZZLY3tilgWtjdIYRy4QDzjHtcj9YSLSFloh-WdQj5dVWBcgD1uI2beguITFpQK5Q1Ot50hGZymX1maG8gq6GXzZn9YE6mMvcyEndmfTdVp6fWzdbBTS39Cq5G72uwj0ChrqOyrZstlk4bcK5V2CLdKuP48lqyCPzInxy4t1lIqBFk4pypL4Gl84EGEyTWOFg" alt="Операторы списков в JS"/></figure>
<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/T6KCf2N4rQHNNvu0FmPwrm1Wjl0Z_PLyMMoLHtBuv_BbqVX5p5nG10AIgtR5-ZQAJ9bN1GAG5dzoj1sNSsUWi7aXGPo4M5gx_lPyIz8MLQmsYzsIfF9QjXa1I-ZsfbwXkfYsfbBjzS99eD3TekzHDTOHbC-nWm7h4VKF9TazahSknboBwF5EG1_s9b_pEs_IZjdtZw" alt="Операторы списков в JS"/></figure>
<p>Так будет выглядеть reduce на практике.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D1%81%D0%BE%D0%B1%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D1%8F"></span>Особенности написания<span class="ez-toc-section-end"></span></h3>
<p>Reduce принимает два параметра object – функцию-коллбек и начальный arr-параметр для аккумулятора.</p>
<p>Операция обязательно возвращает тот или иной результат. Связно это с тем, что при следующей итерации в acc object отобразится результат, который вернулся на предыдущем этапе. На начале обработки первый элемент – это «параметр», который передается вторым из arr в метод reduce.</p>
<p>«Точку старта» для аккумулятора можно не указывать явно. Для этого случае первый компонент в arr встречается на первой итерации:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/Ce1Bur-5MakITcKC7Cj2JYYNUGVcDjOl_D-aoSdgTuX-maKW1s5AZX8Uee-Vqgdcw0Q9q8Q83fUKs4rithCt1s5ES_o9wYC-zsylV70Q94ZcCHRaUoOzxaEblsawPLBmI_h02bkrRSmttQsIBUpFhGseRxfwpJ1WJ-gvEsjxRosAd2-mQnleNWoa2F9WNgBp07YHYg" alt="Операторы списков в JS"/></figure>
<p>В этом example:</p>
<ol><li>Acc на первом проходе – это «единица», val – 2.</li><li>К полученному результату objects прибавляется 3.</li><li>Осуществляется возврат результата через reduce.</li></ol>
<p>Есть и краевой example. Если arr пуст, JS выдаст соответствующую ошибку с сообщением «Reduce of empty arrays with no initial value. Ситуация требует отдельной обработки. Example – обернуть reduce в try…catch. Но лучше всегда задавать function «изначальный параметр».</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B5"></span>Применение на практике<span class="ez-toc-section-end"></span></h3>
<p>Reduce – это object (функция), которая широко распространена в функциональном программировании. Особенно на JS. Далее будут рассмотрены ситуации, при которых нужен соответствующий метод. Все это поможет лучше разобраться в принципах его работы.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="ES5_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F"></span>ES5 версия<span class="ez-toc-section-end"></span></h4>
<p>При работе с node и mdn код может выглядеть громоздко. Часто программисты начинают с ES5. Элементарный код будет выглядеть так:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/XX0oZYn2Dm6b0J22yzzOM04ME8SKZkjf2zMFpAbp4CsZAeSiVxHOLsi4v4pU5V6tD8Z_lyBuGWh-540P5Dfudxrj00mR7Qc1_3-bizsxVqNDNAnoV-e_qOfwpNFc9iYgsUbekPwFr9aY98m5sgS3kdrVZNX3Dvmm0ng4xFjnUBXPGkz5773B1DxQxC_K7XUQS3pIfw" alt="Операторы списков в JS"/></figure>
<p>Остальные примеры – это ES6. Его синтаксис более краткий и оставляет меньше пространства для возникновения тех или иных ошибок.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D1%80%D0%B5%D0%B4%D0%BD%D0%B5%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE"></span><em>Среднее число</em><span class="ez-toc-section-end"></span></h4>
<p>In order требуется не просто вывести сумму, а разделить ее на длину arr перед тем, как отображать итог. Для этого можно задействовать index. Он покажет, сколько раз редюсер прошел по «множеству».</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/XsPt3eMUhCxiS6mAMTQPZiPCGRavga3jxD1uFlY3Bu1jJ2Mw-vtqO0sfHswOXpoL1X1jPLzHrcwZV0mUCozlHOW-uQSCst97_NYz-txJ8myEUVlOfn40FtlWAuRpAH6yKwJ0vKJ6YBsxgUw9cmSvriFvSSKW2A7utxIbQqT8LtedK3qHo0aw70lpVyYiBSCLCp53dA" alt="Операторы списков в JS"/></figure>
<p>Последний «параметр» — это и его сам arr. Выше – пример обнаружения среднего заданных объектов.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A3%D1%87%D0%B5%D1%82_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85"></span><em>Учет данных</em><span class="ez-toc-section-end"></span></h4>
<p>А вот order, который помогает вести учет информации через reduce. Он помогает if есть коллекция информации, но требуется узнать, сколько типов каждого компонента содержится во множестве:</p>
<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/btvUxzjNWrPovI1Ev3mjOumCN2_fjsnlvWF4FVajPkYFJG4fYf9weOgsU_rxW8zlxChpcrOQ8orSa18qsttZUostRTzI2P3BMjA59TbNx7Qrj_SidCM5WKwlyc8pgN-dwoKznBvyNlWxGe1T45RNCzTpGOKR9FZhUtKax6hKUyjlJNXXi4eQ0tMCk1xUV1w0QFrc2w" alt="Операторы списков в JS"/></figure>
<p>Чтобы посчитать каждый объект в arr, требуется сначала задать пустой object, а не все множество. Далее действовать необходимо следующим образом:</p>
<ol><li>Сохранить пару ключ-значение в total: <img alt="Операторы списков в JS" decoding="async" src="https://lh3.googleusercontent.com/62lUJNdHpbf2b2drgXf0c6vBx-rQER532A7JHs42RodfRidvTScKA5kvFbhjbbF7FxbwSGMaGCjo1gk-9S1Z2r2klla-5wsGkvzDWex4uthd_4NR8ZSo5c4Qr55Pt13OyRWIAbPuctrn4-sTT9gYYEclgcXeSCIfovQJp2pwPMFFFFij8QW7hQXzvlSCHwKqPWfygQ" width="412" height="96">.</li><li>Выдать имя первому ключу. Это – первый параметр.</li><li>Присваиваемое значение – «единица». Такой подход позволяет получить объект, где все названия фруктов – это ключи. Каждый имеет значение 1.</li><li>Увеличение length (параметра каждого «фрукта») необходимо, если происходит повторение.</li><li>На втором цикле требуется проверить, есть ли в total ключ с соответствующей «пищей». Если нет – создать ключ. В противном случае – увеличить на +1: <img alt="Операторы списков в JS" decoding="async" src="https://lh3.googleusercontent.com/z5NMoluRpvcmWTsDJH23_vtcTD-5GJ7L5I1rk7FwEzB4klMwPr18aZra00ELYzzGdOo1lg29NSzVSJ3d948Hs5KH8akWn8TPd0xTHR2aE1oz35d-7-ehdXjbQ4CBS2rQjdoVoF-01AL9aMzgJez3XwcNWAvTjWShltgWOqMjrEO_jEZkmg5DADz1F7GbAKz7S9eHvw" width="541" height="181">.</li></ol>
<p>Теперь можно запустить программу и посмотреть, что вышло. Пример – через node.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%BE"></span><em>Соединение воедино</em><span class="ez-toc-section-end"></span></h4>
<p>Reduce помогает сливать друг с другом вложенные значения. Они in order обретают форму единого arr (множества). Выглядит это так:</p>
<ol><li>Сначала нужно выставить изначальное значение на пустое множество. Далее – конкатенировать его с total: <img alt="Операторы списков в JS" loading="lazy" decoding="async" src="https://lh3.googleusercontent.com/z0qGZvI8z33tJYsmn2Ve3Cbn5A7DU1hR8n33pF0hHrGEZLSiPeDhrESprSY1aow-5o5aZ7YK0Hued7g0uG4y_NLHQUa7ngE0dIMRh_cDMcEfdhzVv67JodK1lfRym6fNPzBlZynuPYScGN9zwxdI2hdYNMiSZQA24KRbtSmyvTTJ6EhSXNAmDdzYWSsSbkOjQSPTNA" width="559" height="155">.</li><li>Для более сложной ситуации – получить все цвета с переменной data, которая находится ниже: <img alt="Операторы списков в JS" loading="lazy" decoding="async" src="https://lh6.googleusercontent.com/79Ok9VWL5P89V9vdsfbOMDuy4zGEDPYKai9OebZwTH2w2cZrZxkJwpayZvYEvZi7s-RonkfYDWZ3qNjgk6R-xq3mv3CdhB4MZR4M2jKscBIVSfvDcU78bOMa2SqxJHMm2_Mfch-e70ieIQC5H9bdqlaCeObvufNoHoqOhInYYNBmhaT_JbRGWeye3-Bti6btsMx9jw" width="623" height="110">.</li><li>Пройтись по каждому объекту (push) и взять оттуда нужные цвета. Для этого на помощь придет reduce. Но можно воспользоваться forEach и использовать amount.c. При каждой итерации здесь происходит добавление вложенного arr в total: <img alt="Операторы списков в JS" loading="lazy" decoding="async" src="https://lh5.googleusercontent.com/uqPovuW6vM1VipdqurI_eoIq_rLq8cGf1WSQaoAodSObQRo4kjKraoEOD9BqrSyEw3cTKFlro9EKKQ9YuNUeEr14YWy2BIHXdqOA5SAXOPEJHgkUtSWopuIsB6ghBFbVkvSMGab3Rqh7JavOnj_oxUvHH5WleGqAIACXflc29KlpUc1XuOalZPJRsxY8u38zaafuHQ" width="623" height="202">.</li><li>Если нужно только уникальные «параметры», требуется провести проверку на него в total. Делается это перед тем, как отправить соответствующий компонент в arr: <img alt="Операторы списков в JS" loading="lazy" decoding="async" src="https://lh3.googleusercontent.com/KfyGiRGjhMEKCWECsbCubBSu-dS5WnPNB2Jt4G_-hrsM__RVt9aw0dnkRtHgJ-enWUkGw1LJegrQZ4v7Jpcqs507FNPaDDNOjLNsTSI9Q5DHqsmBcA2AN41Pl95LE8DYixB5oNffBUcmPRbzcHDYFqMo6Oib_WI_IKbQfYrSxlCZEHqNl1stOfgz2zBMFE6yb52eUw" width="615" height="217">.</li></ol>
<p>Это – основы работы со списками и уникальными функциями JS. Освоить их сможет как новичок, так и продвинутый разработчик. Наглядные примеры помогут не запутаться и лучше разобраться в выбранном направлении.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D1%83%D1%80%D1%81%D1%8B_%D0%B4%D0%BB%D1%8F_%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B3%D0%BE_%D0%BE%D1%81%D0%B2%D0%BE%D0%B5%D0%BD%D0%B8%D1%8F"></span>Курсы для быстрого освоения<span class="ez-toc-section-end"></span></h2>
<p>Чтобы лучше изучить метод reduce в JavaScript, а также выяснить, что такое node и функциональное программирование, подойдут специализированные компьютерные курсы. Они намного лучше самообразования.</p>
<p>Рассчитаны программы на срок от нескольких месяцев до года. Пользователи могут выбрать одно или пару направлений одновременно. Каждому гарантировано кураторство опытными специалистами, интересные домашние задания и практика с формированием портфолио. При успешном завершении курсов пользователь получит сертификат, подтверждающий навыки и умения в выбранной области. </p>
<figure class="wp-block-image"><a href="https://otus.ru/lessons/specializacija-fullstack-dev/?utm_source=oj&utm_medium=affilate&utm_campaign=spec_js" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer"><img loading="lazy" decoding="async" width="970" height="70" src="https://otus.ru/journal/wp-content/uploads/2022/02/FullstackSpec_Headline_970x70.png" alt="Операторы списков в JS" class="wp-image-3098" srcset="https://otus.ru/journal/wp-content/uploads/2022/02/FullstackSpec_Headline_970x70.png 970w, https://otus.ru/journal/wp-content/uploads/2022/02/FullstackSpec_Headline_970x70-300x22.png 300w, https://otus.ru/journal/wp-content/uploads/2022/02/FullstackSpec_Headline_970x70-150x11.png 150w, https://otus.ru/journal/wp-content/uploads/2022/02/FullstackSpec_Headline_970x70-768x55.png 768w" sizes="(max-width: 970px) 100vw, 970px" /></a></figure>
<p></p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/javascript/" rel="tag" data-wpel-link="internal">JavaScript</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Foperatory-spiskov-v-js%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Foperatory-spiskov-v-js%2F&text=%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%B2%20JS" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Foperatory-spiskov-v-js%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Foperatory-spiskov-v-js%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2022%2F09%2Foj-1080x720-8-1.png&description=%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%B2%20%D0%B2%20JS" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/applety-v-dzhave/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/applety-v-dzhave/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Апплеты в Джаве" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-7-2-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Апплеты в Джаве" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/applety-v-dzhave/" data-wpel-link="internal">Апплеты в Джаве</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/applety-v-dzhave/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2022-09-27T18:38:09+00:00">27 сентября, 2022</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">7 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/astra-linux-chto-nuzhno-znat-o-pravah-dostupa/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/astra-linux-chto-nuzhno-znat-o-pravah-dostupa/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="100" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20100%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Astra Linux: что нужно знать о правах доступа" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-150x100.png 150w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-300x200.png 300w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-1024x683.png 1024w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-768x512.png 768w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-370x245.png 370w, https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1.png 1080w" data-src="https://otus.ru/journal/wp-content/uploads/2022/09/oj-1080x720-9-1-150x100.png" data-sizes="(max-width: 150px) 100vw, 150px" title="Astra Linux: что нужно знать о правах доступа" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/astra-linux-chto-nuzhno-znat-o-pravah-dostupa/" data-wpel-link="internal">Astra Linux: что нужно знать о правах доступа</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/astra-linux-chto-nuzhno-znat-o-pravah-dostupa/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2022-09-27T18:56:24+00:00">27 сентября, 2022</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">10 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/operatory-spiskov-v-js\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 15:17:22 GMT -->