При работе с различными типами данных и необходимости выполнения определенных операций важно знать о двух ключевых концепциях программирования: функциях высшего порядка и итераторах. Они обеспечивают свободное кодирование, повышая удобочитаемость, эффективность и удобство сопровождения.
Функции высшего порядка
Функции высшего порядка широко используются в программировании, чтобы абстрагироваться от того, как выполняются операции над различными типами данных. Они жизненно важны для упрощения сложного кода, делая его более понятным для инженеров.
Как они работают? Функции высшего порядка принимают функцию в качестве параметра или возвращают ее, а иногда делают и то, и другое. Эти функции часто используют функции обратного вызова, вызываемые во время выполнения функции более высокого порядка.
Например, при вызове функции более высокого порядка и передаче другой функции в качестве аргумента важно помнить, что нельзя включать круглые скобки в имя функции. Это гарантирует, что будет передана сама функция, а не ее результат.
Итераторы: работа с массивами
Методы массива, используемые для перебора элементов, называются методами итерации. Это мощные инструменты, которые помогают манипулировать элементами и возвращать определенные значения. Ниже мы рассмотрим некоторые стандартные итераторы и варианты их использования. Вот необъективные примеры «Лейкерс»:
для каждого()
- Цель: выполнение одной и той же функции для каждого элемента массива.
- Преимущества: более лаконичный и читабельный, чем цикл for. Он абстрагирует управление индексами, уменьшая вероятность ошибок.
- Пример: возвращение ключевых игроков, которых "Лейкерс" уволили в межсезонье.
lakers_resignings = ["D'Angelo Russell", "Austin Reaves", "Rui Hachimura"] lakers_resignings.forEach(player => {console.log(`Welcome back ${player}!`)})
Метод forEach вызывается для массива lakers_resignings. В качестве аргумента он принимает функцию, которая определяется с помощью синтаксиса стрелочной функции (игрок) => {…}.
- Параметр player представляет каждый элемент массива
lakers_resignings
. - Внутри функции оператор console.log печатает приветственное сообщение для каждого игрока.
- Часть
${player}
строки использует синтаксис литерала шаблона для встраивания имени игрока в строку.
карта()
- Цель: Преобразование каждого элемента и создание нового массива с преобразованными значениями. Отлично подходит для преобразования данных.
- Пример: создание секретного сообщения с использованием первой буквы имени игрока «Лейкерс».
const lakers = ['Lebron James', 'Anthony Davis', 'Austin Reaves', 'Max Christie', 'Cam Reddish', 'Jarred Vanderbilt']; const secretMessage = lakers.map(player => {return player[0]}) console.log(secretMessage.join(''));
Метод .map()
используется для перебора массива lakers
. Предоставленная функция стрелки принимает имя каждого игрока и возвращает первый символ (с индексом 0) имени. Результатом является новый массив secretMessage
, состоящий из первых букв имени каждого игрока.
фильтр()
- Цель: создает новый массив, содержащий элементы, соответствующие заданному условию. Идеально подходит для задач фильтрации данных.
- Пример: фильтрация имени игрока «Лейкерс», состоящего более чем из 7 символов:
const lakersRoster = ["Lebron","Anthony", "Jarred", "Austin", "DAngelo", "Cam"]; const filteredRoster = lakersRoster.filter(player => player.length > 7); console.log(filteredRoster);
Метод .filter()
вызывается для массива lakersRoster
, и для каждого элемента (имени игрока) вызывается стрелочная функция player => player.length > 7
.
Внутри стрелочной функции условие player.length > 7
проверяет, больше ли длина имени игрока 7.
Если условие истинно, имя игрока включается в результирующий массив filteredRoster
.
уменьшить()
- Цель: накапливает одно значение на основе элементов массива с помощью специальной логики накопления.
- Пример. Рассчитайте общую зарплату команды "Лейкерс".
const lakersSalaries = [ { name: 'LeBron James', salary: 41490000 }, { name: 'Anthony Davis', salary: 35100000 }, { name: 'Austin Reaves', salary: 1500000 }, { name: 'Max Christie', salary: 2000000 }, { name: 'Cam Reddish', salary: 4500000 }, { name: 'Jarred Vanderbilt', salary: 3000000 } ]; const totalSalary = lakersSalaries.reduce((total, player) => total + player.salary, 0); console.log(`Total Lakers' salaries: $${totalSalary}`);
Метод .filter()
используется для массива lakersRoster
. В качестве аргумента предоставляется стрелочная функция player => player.length > 7
, которая вызывается для каждого имени в массиве.
player
: Представляет обрабатываемое имя текущего игрока.player.length > 7
: Проверяет, больше ли длина имени текущего игрока 7.- Если условие истинно, имя включается в результирующий массив
filteredRoster
.
Как правильно выбрать итератор?
Выбор правильного итератора зависит от поставленной задачи:
- Преобразование данных: используйте `.map()` при преобразовании каждого элемента.
- Фильтрация:используйте `.filter()` для создания массивов на основе условий. .
— Побочные эффекты: `.forEach()` помогает регистрировать внешние API или взаимодействовать с ними.
— Доступ к индексу: традиционный цикл for предлагает больший контроль при манипулировании индексами.
- Функциональный и императивный подходы: отдавайте предпочтение таким методам, как `.map()` и `.filter()`, для функционального программирования, в то время как циклы больше подходят для императивного управления.
– Читаемость и ремонтопригодность.Всегда стремитесь к краткому, не требующему пояснений коду, который соответствует цели вашей задачи.
Функции высшего порядка и итераторы — мощные инструменты в наборе инструментов разработчика. Они способствуют эффективному, чистому и свободному программированию, помогая как опытным разработчикам, так и новичкам.
Будь то преобразование данных, их фильтрация или просто повторение массива, понимание того, как использовать функции и итераторы более высокого порядка, может сделать ваш код более надежным и удобным в сопровождении. Не забудьте начать с определения вашей основной цели и выбора наилучшего метода для удовлетворения ваших потребностей.