Распространенный вариант использования циклов с массивами — агрегация. Агрегацией называются любые вычисления, которые строятся на основе всего набора данных: например, поиск максимального значения, среднего, суммы и так далее. Процесс агрегации не требует от программиста знания нового синтаксиса, но влияет на алгоритм решения задач. Поэтому имеет смысл рассмотреть его отдельно. Начнем с поиска максимального значения:
const calculateMax = (coll) => {
// Если коллекция пустая, то у нее не может быть максимального значения
// В подобных ситуациях принято возвращать null
// Это классический пример использования идиомы guard expression
if (coll.length === 0) {
return null;
}
// Сравнение элементов нужно начать с какого-то первого элемента
let max = coll[0]; // Принимаем за максимальное значение первый элемент
// Обход начинаем со второго элемента
for (let i = 1; i < coll.length; i += 1) {
const currentElement = coll[i];
// Если текущий элемент больше максимального,
// то он становится максимальным
if (currentElement > max) {
max = currentElement;
}
}
// Не забываем вернуть максимальное число
return max;
};
console.log(calculateMax([])); // => null
console.log(calculateMax([3, 2, -10, 38, 0])); // => 38
https://repl.it/@hexlet/js-arrays-aggregation-max
В этом примере агрегации мы видим вычисление, которое включает в себя сравнение всех элементов для поиска одного, которое станет результатом этой операции.
Обратите внимание, что начальным значением max
взят первый элемент, а не 0
или любое другое число. Ведь может оказаться так, что все числа в массиве меньше 0
, и тогда мы получим неверный ответ.
Теперь рассмотрим поиск суммы:
const calculateSum = (coll) => {
// Начальное значение суммы
// Используем переменную, так как в процессе работы сумма будет меняться
let sum = 0;
for (let i = 0; i < coll.length; i += 1) {
// Поочередно складываем все элементы
sum += coll[i];
}
return sum;
};
// Сумма элементов всегда возвращает какое-то число
// Если массив пустой, то сумма его элементов равна нулю
console.log(calculateSum([])); // => 0
console.log(calculateSum([3, 2, -10, 38, 0])); // => 33
// Процесс вычислений
let sum = 0;
sum = sum + 3; // 3
sum = sum + 2; // 5
sum = sum + -10; // -5
sum = sum + 38; // 33
sum = sum + 0; // 33
https://repl.it/@hexlet/js-arrays-aggregation-sum
Алгоритм поиска суммы значительно проще, но обладает парой важных нюансов.
Чему равна сумма элементов пустого массива? С точки зрения математики такая сумма равна 0
, что совпадает со здравым смыслом. Если у нас нет яблок, значит у нас есть 0
яблок. Другими словами, количество яблок равно нулю. Функции в программировании работают по такой же логике.
Второй момент связан с начальным элементом суммы. У переменной sum
есть начальное значение равное 0
. Зачем вообще задавать значение? Любая повторяющаяся операция начинается с какого-то значения. Нельзя просто так объявить переменную и начать с ней работать внутри цикла. Это приведет к неверному результату:
// Начальное значение не задано
// Поэтому JavaScript автоматически считает, что начальное значение равно undefined
let sum;
// Первая итерация цикла
sum = sum + 2; // ?
В результате такого вызова внутри sum
окажется NaN
, то есть не-число. Оно возникает из-за попытки сложить 2
и undefined
. Значит какое-то значение все же нужно. В коде выше выбран 0, потому что все остальные варианты приведут к неверному результату. Если начальное значение будет равно 1, то результат получится на единицу больше, чем нужно.
В математике существует понятие нейтральный элемент бинарной операции — это элемент, который ничего не меняет в результате его использования. Другими словами, сложение любого числа с нулем всегда дает это же число. Тогда любую сумму, например 3 + 2 + 8
, можно вычислить как 0 + 3 + 2 + 8
, чем мы и пользуемся в нашем коде.
Нейтральный элемент – это важная часть любой агрегирующей операции. Именно с него начинается сам процесс агрегации. В случае сложения – это 0, в случае умножения – 1. Даже у конкатенации есть нейтральный элемент – это пустая строка: '' + 'one'
будет 'one'
.
Агрегация далеко не всегда означает, что коллекция элементов сводится к некоторому простому значению. Результатом агрегации может быть даже сложная структура — например, массив. Подобные примеры часто встречаются в реальной жизни. Самый простой пример – это список уникальных слов в тексте.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт