JavaScript. Подробное руководство, 6-е издание
Шрифт:
var mean = data.reduce(sum)/data.length;
var deviations = data.map(function(x) {return x-mean;});
var stddev = Math.sqrt(deviations.map(square).reduce(sum)/(data.length-1));
A как быть, если в нашем распоряжении имеется только реализация ЕСМА-Script 3, где отсутствуют эти новейшие методы массивов? Можно определить собственные функции mар и reduce, которые будут использовать встроенные методы при их наличии:
// Вызывает функцию f для каждого элемента массива и возвращает массив результатов.
// Использует метод Array.prototype.mар, если он определен,
var mар = Array.prototype.тар
? function(a, f) { return a.map(f); } // Если метод map доступен
: function(a,f) { // Иначе реализовать свою версию
var results = [];
for(var і = 0, len = a.length; і < len; і++) {
if (і in a) results[i] = f.call(null, a[i], і, a);
}
return results;
};
// Выполняет свертку массива в единственное значение, используя функцию f
// и необязательное начальное значение. Использует метод Array.prototype.reduce,
// если он определен.
var reduce = Array.prototype.reduce
? function(a, f, initial) { // Если метод reduce доступен,
if (arguments.length > 2)
return a.reduce(f, initial); // Если указано начальное значение,
else return a.reduce(f); // Иначе без начального значения.
}
: function(a, f, initial) { // Этот алгоритм взят из спецификации ES5
var і = 0, len = a.length, accumulator;
// Использовать указанное начальное значение или первый элемент а
if (arguments.length > 2)
accumulator = initial;
else { // Найти первый элемент массива с определенным значением
if (len == 0) throw TypeError;
while(i < len) {
if (i in a) {
accumulator = a[i++];
break;
}
else i++;
}
if (i == len) throw TypeError;
}
// Теперь вызвать f для каждого оставшегося элемента массива
while(i < len) {
if (і in а)
accumulator = f.call(undefined, accumulator, a[i], i, a);
i++;
}
return accumulator;
};
После определения этих функций
map
и reduce
вычисление среднего и стандартного отклонения будет выглядеть так:
var data = [1,1,3,5,5];
var sum = function(x.y) { return x+y; };
var square = function(x) { return x*x; };
var mean = reduce(data, sum)/data.length;
var deviations = map(data, function(x) {return x-mean;});
var stddev = Math.sqrt(reduce(map(deviations, square), sum)/(data.length-1));
8.8.2. Функции высшего порядка
Функции высшего порядка - это функции, которые оперируют функциями, принимая одну или более функций и возвращая новую функцию. Например:
// Эта функция высшего порядка возвращает новую функцию, которая передает свои аргументы
// функции f и возвращает логическое отрицание значения, возвращаемого функцией f;
function not(f) {
return function { // Возвращает новую функцию
var result = f.apply(this, arguments); // вызов f
Поделиться:
Популярные книги
Солнечный флот
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Кодекс Охотника. Книга XXXIV
34. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Варяг
1. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Черный Маг Императора 7 (CИ)
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 7
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Крови. Книга ХIV
14. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Справочник логопеда
Научно-образовательная:
медицина
6.25
рейтинг книги
Перешагнуть пропасть
1. Перешагнуть пропасть
Фантастика:
боевая фантастика
космическая фантастика
8.38
рейтинг книги
Миротворец. Дипломатия Кланов
1. Миротворец
Фантастика:
историческое фэнтези
фэнтези
5.00
рейтинг книги
Демон-хранитель
Фантастика:
фэнтези
мистика
5.20
рейтинг книги
Твое сердце будет разбито. Книга 1
Любовные романы:
современные любовные романы
5.50
рейтинг книги
Последний Паладин. Том 11
11. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXI
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Хроники Тириса. Книга 3
3. Хроники Тириса
Фантастика:
боевая фантастика
космическая фантастика
фантастика: прочее
5.00