Найти в Дзене

5 способов посчитать сумму чисел в JS-массиве

Как-то раз ко мне на собеседование пришёл синьор-разработчик. Сходу сказал, что его услуги стоят не меньше чем 250, но у нас очень интересная компания, так что он согласен и на 180 — в общем, сразу ясно, перед нами уверенный в себе профессионал. Ради шутки я все таки задал свой любимый разминочный вопрос: как посчитать сумму числового массива numbers = [90, 12, 76]? Парень сразу скукожился, 10 минут думал, затем сказал, что забыл повторить эту продвинутую тему. Дальше беседа уже как-то не клеилась. Чтобы вы не попали в такую неловкую ситуацию, покажу вам не один, а целых 5 способов решить эту сложную задачу. Начнем с нормальных способов — даже у такого зануды, как я, на ревью не возникло бы к ним вопросов. reduce const sum = numbers.reduce((sum, x) => sum + x, 0) Функциональный ES5-reduce — пишется в одну строку и не создает дополнительных переменных. Красота! forEach Можно переписать то же самое через forEach: let sum = 0
numbers.forEach(x => {
sum += x
}) Сказать по правде, я час
Оглавление

Как-то раз ко мне на собеседование пришёл синьор-разработчик. Сходу сказал, что его услуги стоят не меньше чем 250, но у нас очень интересная компания, так что он согласен и на 180 — в общем, сразу ясно, перед нами уверенный в себе профессионал. Ради шутки я все таки задал свой любимый разминочный вопрос: как посчитать сумму числового массива numbers = [90, 12, 76]? Парень сразу скукожился, 10 минут думал, затем сказал, что забыл повторить эту продвинутую тему. Дальше беседа уже как-то не клеилась. Чтобы вы не попали в такую неловкую ситуацию, покажу вам не один, а целых 5 способов решить эту сложную задачу.

Как же их сложить, ааа, думай, думай
Как же их сложить, ааа, думай, думай

Начнем с нормальных способов — даже у такого зануды, как я, на ревью не возникло бы к ним вопросов.

reduce

const sum = numbers.reduce((sum, x) => sum + x, 0)

Функциональный ES5-reduce — пишется в одну строку и не создает дополнительных переменных. Красота!

forEach

Можно переписать то же самое через forEach:

let sum = 0
numbers.forEach(x => {
sum += x
})

Сказать по правде, я часто использую этот способ вместо reduce — более сложная логика получается гораздо читаемее.

Цикл по индексу

Классический си-подобный цикл по индексу никогда не подведёт:

let sum = 0
for (let i = 0; i < numbers.length; i++) {
sum += numbers[i]
}

Если спросите меня, кто не может написать это с закрытыми глазами должен собрать все остатки совести и никогда больше не приближаться к коду. Тут даже js знать не надо. Конечно, выглядит потяжелее первых двух вариантов (разве нам правда нужен i?), но тут есть 2 бонуса. Во-первых, вместо настоящего массива numbers в таком цикле может быть ArrayLike — querySelectorAll или arguments. Во-вторых, умные ребята оптимизировали это 25 лет, так что это просто быстро — в критичном месте кода самое оно.

Цикл с итератором

С какого-то момента жс поддерживает питоноподобный for..of:

let sum = 0
for (const x of numbers) {
sum += x
}

Никогда не был фанатом такого синтаксиса, но зато тут мы работаем с итератором по numbers, так что общность! Можно запихнуть туда любую другую коллецию — Map, Set или NodeList, и все будет работать (если браузер поддерживает).

Библиотека

В конце концов, можно использовать какую-нибудь библиотеку. simple-statistics, например, складывает числа специальным алгоритмом, который уменьшает ошибки округления:

import { sum } from 'simple-statistics'
const sum = sum(numbers)

Для совсем неуверенных в своих силах можно взять лодаш и сделать _.sum(numbers).

Вот 5 прекрасных способов сложить числа в массиве. Думаете, это всё? Да я только начал входить во вкус! В следующем выпуске расскажу про 5 более извращенных способов сложить числа в массиве. Угадаете, какие? Предлагайте в комментариях!

Хотите стать настоящими программистами — ставьте лайк и подписывайтесь на мой канал.