JavaScript. Подробное руководство, 6-е издание, стр. 103
<b> var results = [];</b><b> for(var і = 0, len = a.length; і < len; і++) {</b><b> if (і in a) results[i] = f.call(null, a[i], і, a);</b><b> }</b><b> return results;</b><b>};</b><b>// Выполняет свертку массива в единственное значение, используя функцию f</b><b>// и необязательное начальное значение. Использует метод Array.prototype.reduce,</b><b>// если он определен.</b><b>var reduce = Array.prototype.reduce</b><b> ? function(a, f, initial) { // Если метод reduce() доступен,</b><b> if (arguments.length > 2)</b><b> return a.reduce(f, initial); // Если указано начальное значение, </b><b> else return a.reduce(f); // Иначе без начального значения.</b><b> }</b><b> : function(a, f, initial) { // Этот алгоритм взят из спецификации ES5</b><b> var і = 0, len = a.length, accumulator;</b><b> // Использовать указанное начальное значение или первый элемент а </b><b> if (arguments.length > 2)</b><b> accumulator = initial; </b><b> else { // Найти первый элемент массива с определенным значением </b><b> if (len == 0) throw TypeError();</b><b> while(i < len) {</b><b> if (i in a) {</b><b> accumulator = a[i++];</b><b> break;</b><b> }</b><b> else i++;</b><b> }</b><b> if (i == len) throw TypeError();</b><b> }</b><b> // Теперь вызвать f для каждого оставшегося элемента массива</b><b> while(i < len) {</b><b> if (і in а)</b><b> accumulator = f.call(undefined, accumulator, a[i], i, a);</b><b> i++;</b><b> }</b><b> return accumulator;</b><b>};</b>После определения этих функций
<b>map()</b><b>reduce()</b><b>var data = [1,1,3,5,5];</b><b>var sum = function(x.y) { return x+y; };</b><b>var square = function(x) { return x*x; };</b><b>var mean = reduce(data, sum)/data.length;</b><b>var deviations = map(data, function(x) {return x-mean;});</b><b>var stddev = Math.sqrt(reduce(map(deviations, square), sum)/(data.length-1));</b>8.8.2. Функции высшего порядка
Функции высшего порядка - это функции, которые оперируют функциями, принимая одну или более функций и возвращая новую функцию. Например:
<b>// Эта функция высшего порядка возвращает новую функцию, которая передает свои аргументы </b><b>// функции f и возвращает логическое отрицание значения, возвращаемого функцией f; </b><b>function not(f) {</b><b> return function() { // Возвращает новую функцию</b><b> var result = f.apply(this, arguments); // вызов f </b><b> return !result; // и инверсия результата.</b><b> };</b><b>}</b><b>var even = function(x) { // Функция, определяющая четность числа </b><b> return х % 2 === 0;</b><b>};</b><b>var odd = not(even); // Новая функция, выполняющая противоположную операцию</b><b>[1,1,3,5,5].every(odd); // => true: все элементы массива нечетные</b>Функция
<b>not()</b><b>mаррег(),</b><b>mар(),</b><b>// Возвращает функцию, которая принимает массив в виде аргумента, применяет функцию f </b><b>// к каждому элементу и возвращает массив возвращаемых значений.</b><b>// Эта функция отличается от функции тар(), представленной выше, </b><b>function mapper(f) {</b>