Функция сложения всех положительных чисел в массиве
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)
В результате получаем сумму всех положительных чисел массива, равную 10.
Как работает функция сложения всех положительных чисел массива?
На конкретном массиве мы разберём логику работы функции. Пусть у нас будет массив для эксперимента:
var massiv = [-10, -5, -5, 0, 5, 5, 20]
Мы будем «чейнить»(цепочничать) — это значит, что мы напишем всю логику на существующих методах языка JavaScript и каждый отдельный блок будет прерываться точкой — .
На первом этапе нам нужно получить только те элементы массива, которые больше нуля. С этой задачей идеально справляется метод filter(). Он бегает по массиву и проверяет условие на каждом элементе. Если условие «трушное» (true), тогда этот элемент попадает в новый массив, если условие «фолсное» (false), тогда не попадает. Условие такое — значение элемента оригинального массива больше нуля.
Эта проверка(фильтрация) выглядит так:
massiv.filter(i => i > 0)
Что получится?
Мы успешно отфильтровали положительные числа из оригинального массива. То есть нам вернулся новый массив:
[5, 5, 20]
Теперь по этому массиву нам надо пробежаться по каждому элементу и наполнить «аккумулятор» значениями суммирования. С этой задачей идеально справляется метод map().
Первый параметр для map() будет изменять значение аккумулятора и возвращать его в новый массив. То есть на каждом шаге метода мы будем получать текущее значение в элементе оригинального массива, прибавлять его к аккумулятору и возвращать в новый массив. При таком подходе каждый текущий элемент нового массива будет являться суммой всех пройденных элементов оригинального массива.
Второй параметр для map() будет сам объект аккумулятор — это наш x, с присвоенным значением 0. Он объявлен «до» анонимной функции, а значит будет перезаписываться новыми значениями.
В качестве объекта аккумулятора мы будем использовать переменную x=0.
[5, 5, 20].map(i => x += i, x=0)
Что получится?
Каждая итерация наращивала «суммную» массу и «откладывала» её в элементы нового массива. Это значит, что в этом массиве нам плевать на все элементы кроме последнего, потому что значение последнего элемента — это и есть сумма всех значений элементов оригинального массива. Это то, что нам нужно. Остаётся только дотянуться до последнего элемента. Как это сделать?
Проще всего перевернуть текущий массив и обратиться к его первому элементу — к индексу ноль.
[5, 10, 30].reverse()[0] 30
Что получится?
Вот и всё! Готово.
Собственный метод для объектов-прототипов 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 | Как сложить все отрицательные числа в массиве?
Стандарт ECMAScript — Раздел «23.1.3 Properties of the Array Prototype Object» — https://tc39.es/ecma262/#sec-properties-of-the-array-prototype-object