← Назад к вопросам
Как посчитать сумму элементов массива?
1.0 Junior🔥 212 комментариев
#JavaScript Core
Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как посчитать сумму элементов массива
Это базовый вопрос про работу с массивами. Покажу все способы от простого к сложному.
1. Цикл for (классический способ)
const numbers = [1, 2, 3, 4, 5];
let sum = 0;
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
console.log(sum); // 15
Особенности:
- Самый простой способ понять
- Быстрый и надёжный
- Легко отладить
- Полный контроль
2. forEach метод
const numbers = [1, 2, 3, 4, 5];
let sum = 0;
numbers.forEach(num => {
sum += num;
});
console.log(sum); // 15
Особенности:
- Функциональный стиль
- Читаемый код
- Не может вернуть значение
- Немного медленнее чем for
3. reduce метод (ЛУЧШИЙ СПОСОБ)
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, num) => {
return acc + num;
}, 0);
console.log(sum); // 15
// Или короче
const sum2 = numbers.reduce((acc, num) => acc + num, 0);
console.log(sum2); // 15
Особенности:
- Функциональный подход
- Возвращает значение
- Нет побочных эффектов
- Идеален для трансформаций
- acc - аккумулятор (содержит текущую сумму)
- num - текущий элемент
- 0 - начальное значение аккумулятора
Процесс:
Шаг 1: acc = 0, num = 1 -> 0 + 1 = 1
Шаг 2: acc = 1, num = 2 -> 1 + 2 = 3
Шаг 3: acc = 3, num = 3 -> 3 + 3 = 6
Шаг 4: acc = 6, num = 4 -> 6 + 4 = 10
Шаг 5: acc = 10, num = 5 -> 10 + 5 = 15
Результат: 15
4. Встроенный метод (если бы существовал)
// К сожалению, Math.sum() не существует
// Но можно использовать спред оператор с другими методами
const numbers = [1, 2, 3, 4, 5];
const sum = Math.max(...numbers); // для максимума
// Для суммы нужна свой вычисление
5. Практические примеры
Сумма цен товаров
const items = [
{ name: 'Яблоко', price: 10 },
{ name: 'Банан', price: 5 },
{ name: 'Апельсин', price: 8 }
];
// Способ 1: reduce (ЛУЧШЕ)
const total = items.reduce((sum, item) => sum + item.price, 0);
console.log(total); // 23
// Способ 2: forEach
let total2 = 0;
items.forEach(item => {
total2 += item.price;
});
console.log(total2); // 23
Сумма с условием
const numbers = [1, 2, 3, 4, 5, 6];
// Сумма только чётных чисел
const evenSum = numbers.reduce((sum, num) => {
return num % 2 === 0 ? sum + num : sum;
}, 0);
console.log(evenSum); // 2 + 4 + 6 = 12
// Или с filter
const evenSum2 = numbers
.filter(num => num % 2 === 0)
.reduce((sum, num) => sum + num, 0);
console.log(evenSum2); // 12
Вложенные массивы
const matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// Сумма всех элементов
const total = matrix.reduce((sum, row) => {
return sum + row.reduce((rowSum, num) => rowSum + num, 0);
}, 0);
console.log(total); // 45
Сумма по категориям
const transactions = [
{ category: 'food', amount: 100 },
{ category: 'transport', amount: 50 },
{ category: 'food', amount: 75 },
{ category: 'transport', amount: 30 }
];
// Сумма по категориям
const byCategory = transactions.reduce((acc, trans) => {
acc[trans.category] = (acc[trans.category] || 0) + trans.amount;
return acc;
}, {});
console.log(byCategory);
// { food: 175, transport: 80 }
6. TypeScript типизация
// С типами
const numbers: number[] = [1, 2, 3, 4, 5];
const sum: number = numbers.reduce((acc: number, num: number) => {
return acc + num;
}, 0);
// С интерфейсом
interface Item {
name: string;
price: number;
}
const items: Item[] = [
{ name: 'Яблоко', price: 10 },
{ name: 'Банан', price: 5 }
];
const total: number = items.reduce((sum, item) => sum + item.price, 0);
7. Производительность
const numbers = Array.from({ length: 1000000 }, (_, i) => i);
// Способ 1: reduce
console.time('reduce');
const sum1 = numbers.reduce((a, b) => a + b, 0);
console.timeEnd('reduce'); // ~5ms
// Способ 2: forEach
console.time('forEach');
let sum2 = 0;
numbers.forEach(n => sum2 += n);
console.timeEnd('forEach'); // ~6ms
// Способ 3: for
console.time('for');
let sum3 = 0;
for (let i = 0; i < numbers.length; i++) {
sum3 += numbers[i];
}
console.timeEnd('for'); // ~4ms - БЫСТРЕЕ!
// Способ 4: for...of
console.time('for...of');
let sum4 = 0;
for (const n of numbers) {
sum4 += n;
}
console.timeEnd('for...of'); // ~5ms
Вывод: for быстрее всех, но разница минимальна. Выбирай читаемость!
8. Реальный пример: React компонент
function ShoppingCart({ items }) {
// Посчитать сумму товаров
const total = items.reduce((sum, item) => {
return sum + (item.price * item.quantity);
}, 0);
// Посчитать количество товаров
const count = items.reduce((sum, item) => sum + item.quantity, 0);
// Посчитать скидку
const discount = total > 100 ? total * 0.1 : 0;
// Итого
const finalTotal = total - discount;
return (
<div>
<h2>Товары в корзине: {count}</h2>
<p>Сумма: {total.toFixed(2)}р</p>
{discount > 0 && <p>Скидка: -{discount.toFixed(2)}р</p>}
<strong>Итого: {finalTotal.toFixed(2)}р</strong>
</div>
);
}
9. Обработка ошибок
// Пустой массив
const empty = [];
const sum1 = empty.reduce((a, b) => a + b, 0);
console.log(sum1); // 0 (без ошибки благодаря начальному значению)
// Без начального значения
const sum2 = empty.reduce((a, b) => a + b);
console.log(sum2); // ОШИБКА: Reduce of empty array with no initial value
// Правильно:
const sum3 = empty.reduce((a, b) => a + b, 0); // 0
// Массив с null/undefined
const mixed = [1, null, 3, undefined, 5];
const sum4 = mixed.reduce((a, b) => a + (b || 0), 0);
console.log(sum4); // 9 (1 + 0 + 3 + 0 + 5)
10. Чеклист при использовании reduce
// ✓ Всегда передавай начальное значение
array.reduce((acc, item) => acc + item, 0); // хорошо
array.reduce((acc, item) => acc + item); // ПЛОХО
// ✓ Проверь типы данных
const items = [{ price: 10 }, { price: 'invalid' }];
const sum = items.reduce((acc, item) => {
return acc + (typeof item.price === 'number' ? item.price : 0);
}, 0);
// ✓ Используй более простой код если возможно
const sum1 = array.reduce((a, b) => a + b, 0); // просто
const sum2 = array.reduce((acc, num) => acc + num, 0); // тоже просто
const sum3 = array.reduce((accumulator, number) => accumulator + number, 0); // многовато
// ✓ Помни что reduce трансформирует в скалярное значение
const result = array.reduce((acc, item) => {
acc.sum += item.price;
acc.count += 1;
return acc;
}, { sum: 0, count: 0 }); // можно возвращать объект
Итого
Для подсчёта суммы элементов массива:
Быстрый ответ:
const sum = array.reduce((a, b) => a + b, 0);
Для чётных чисел:
const sum = array
.filter(n => n % 2 === 0)
.reduce((a, b) => a + b, 0);
Для объектов:
const sum = items.reduce((total, item) => total + item.price, 0);
Рекомендация:
- Используй reduce для чистого функционального стиля
- Используй for если нужна максимальная производительность
- Используй forEach если нужна простота и читаемость
- ВСЕГДА передавай начальное значение в reduce!