JavaScript | Как сложить все положительные числа в массиве?

JavaScript | Как сложить все положительные числа в массиве?

Функция сложения всех положительных чисел в массиве

function sumPlus (arr) {
   return arr.filter(i => i > 0).map(i => x += i, x=0).reverse()[0]
}

Пример работы функции:

var massiv = [-5, -3, -2 , 0, 2, 3, 5]
sumPlus (massiv)
Функция сложения всех положительных чисел в массиве - JavaScript
Функция сложения всех положительных чисел в массиве — JavaScript

В результате получаем сумму всех положительных чисел массива, равную 10.

 

Как работает функция сложения всех положительных чисел массива?

На конкретном массиве мы разберём логику работы функции. Пусть у нас будет массив для эксперимента:

var massiv = [-10, -5, -5, 0, 5, 5, 20]

Мы будем «чейнить»(цепочничать) — это значит, что мы напишем всю логику на существующих методах языка JavaScript и каждый отдельный блок будет прерываться точкой — .

На первом этапе нам нужно получить только те элементы массива, которые больше нуля. С этой задачей идеально справляется метод filter(). Он бегает по массиву и проверяет условие на каждом элементе. Если условие «трушное» (true), тогда этот элемент попадает в новый массив, если условие «фолсное» (false), тогда не попадает. Условие такое — значение элемента оригинального массива больше нуля.

Эта проверка(фильтрация) выглядит так:

massiv.filter(i => i > 0)

Что получится?

Отфильтровали положительные числа из массива - JavaScript
Отфильтровали положительные числа из массива — JavaScript

Мы успешно отфильтровали положительные числа из оригинального массива. То есть нам вернулся новый массив:

[5, 5, 20]

Теперь по этому массиву нам надо пробежаться по каждому элементу и наполнить «аккумулятор» значениями суммирования. С этой задачей идеально справляется метод map().

Первый параметр для map() будет изменять значение аккумулятора и возвращать его в новый массив. То есть на каждом шаге метода мы будем получать текущее значение в элементе оригинального массива, прибавлять его к аккумулятору и возвращать в новый массив. При таком подходе каждый текущий элемент нового массива будет являться суммой всех пройденных элементов оригинального массива.

 

Второй параметр для map() будет сам объект аккумулятор — это наш x, с присвоенным значением 0. Он объявлен «до» анонимной функции, а значит будет перезаписываться новыми значениями.

В качестве объекта аккумулятора мы будем использовать переменную x=0

[5, 5, 20].map(i => x += i, x=0)

Что получится?

Сделали массив из сумм элементов оригинального - JavaScript
Сделали массив из сумм элементов оригинального — JavaScript

Каждая итерация наращивала «суммную» массу и «откладывала» её в элементы нового массива. Это значит, что в этом массиве нам плевать на все элементы кроме последнего, потому что значение последнего элемента — это и есть сумма всех значений элементов оригинального массива. Это то, что нам нужно. Остаётся только дотянуться до последнего элемента. Как это сделать?

Проще всего перевернуть текущий массив и обратиться к его первому элементу — к индексу ноль.

[5, 10, 30].reverse()[0]
30

Что получится?

Перевернули массив - JavaScript
Перевернули массив — JavaScript

Вот и всё! Готово.

 

 

Собственный метод для объектов-прототипов Array

Array.prototype.sumPlus = function() {
   return this.filter(i=>i>0).map(i=>x+=i,x=0).reverse()[0]
}

Пример работы метода:

[-5, -3, -2 , 0, 2, 3, 5].sumPlus()
10
Свой метод сложения всех положительных чисел в массиве - JavaScript
Свой метод сложения всех положительных чисел в массиве — JavaScript

 

Информационные ссылки

JavaScript | Как сложить все числа в массиве?

JavaScript | Как сложить все отрицательные числа в массиве?

Стандарт ECMAScript — Раздел «23.1.3 Properties of the Array Prototype Object» — https://tc39.es/ecma262/#sec-properties-of-the-array-prototype-object