Было бы весьма полезно, если бы jQuery имел функцию reduce()
.
При работе со списками данных большинство функциональных языков и, в действительности, большинство традиционных языков в наши дни имеют методы, которые выполняют повторяющуюся функцию надвесь список, принимая каждый элемент по очереди и применяя к нему функцию.
Простейшим из них является map
, который jQuery реализует для вас.Это берет список и применяет функцию к каждому элементу и возвращает список результатов, один результат на запись в списке.например.[1,2,3] -> (map x2) -> [2,4,6]
.
Иногда вам нужен общий или коллективный результат из списка, а не из списка отдельных отображений.Именно здесь начинается операция reduce
(или fold
). К сожалению, jQuery не имеет этот метод в стандартной комплектации, поэтому ниже приведен плагин для него.Функция reduce
принимает значение аккумулятора и значение текущего элемента и возвращает модифицированный аккумулятор, который будет передан следующему вызову.например.[1,2,3,4] -> (reduce + [initial:0]) -> 10 = ( ( ( (0 + 1) + 2 ) + 3 ) + 4 )
или ([1,2,3,4] -> (reduce * [initial:1]) -> 24 = ( ( ( (1 * 1) * 2 ) * 3 ) * 4 )
.
(function($) {
$.reduce = function(arr, callback, initial) {
var accumulator = initial || 0;
$.each(arr, function(index, value) {
accumulator = callback(accumulator, value, index);
});
return accumulator;
}
})(jQuery);
Тогда вы можете использовать его следующим образом, чтобы получить сумму квадратов:
var answer = $.reduce($('input:text'), function(acc, elem) {
var cVal = $(elem).val();
return acc + cVal * cVal;
}, 0);