SIMD-операции над массивами: forEach, map, reduce.
forEach
Синтаксис: [].forEach(callback[, thisArg]). Функция callback принимает параметры element, index и array.
map
Синтаксис: [].map(callback[, thisArg]). Функция callback принимает параметры element, index и array.
Примеры
Возведение в квадрат всех элементов массива:
[1,2,3].map(function(a) { return a*a; });
Массив с кодами символов:
Array.prototype.map.call(«Hello World», function(x) { return x.charCodeAt(0); })
Примечания
Не забывайте про уловки map:
([‘1′, ‘2’, ‘3’]).map(parseInt) // [1, NaN, NaN]
([1, 2, 3]).map(toString) // [undefined, undefined, undefined]
Map передаёт в callback-функцию три параметра (item, index, list), а parseInt и toString вторым параметром принимают основание системы счисления.
reduce
Синтаксис: [].reduce(callback[, initialValue]). Функция callback принимает параметры previousValue, currentValue, index и array.
Функция последовательно вызывается для каждого существующего элемента массива, с нулевого и до последнего (слева направо). Есть функция reduceRight, идущая в обратном направлении, с последнего элемента до нулевого.
Примеры
Сложение всех элементов массива:
[1,2,3].reduce(function(a, b) { return a+b; });
Join массива в строку, тот же код callback:
[‘a’, ‘bc’, ‘def’].reduce(function(a, b) { return a+b; });
Сделать массив одномерным:
[[1, 5], [10, 8, 9 ] ].reduce(function(a, b) { return a.concat(b); });
Матстатистика:
var arr=[1,2,3];
//Среднее значение массива (матожидание):
var mean=arr.reduce(function(a, b) { return a+b; })/arr.length;
//Среднеквадратичное отклонение:
var std_deviation=Math.sqrt(arr.reduce(function(a, b) {
var dev = b - mean;
return a+dev*dev;
})/arr.length);
Примечания
Нужно помнить, что первый параметр функции callback — это значение суммы, поэтому для сложения значений массива объектов нужно писать так: [{x:1},{x:2},{x:4}].arr.reduce(function(a,b){return {x: a.x + b.x};}) — накапливаем сумму в объекте с полем x. Можно сделать иначе, объявлять начальное значение: [{x:1}, {x:2}, {x:4}].reduce(function (a, b) { return a + b.x; }, 0);
Для получения суммы квадратов чисел можно сделать так: [1,2,3].map(function(a) { return a*a; }).reduce(function(a, b) {return a+b; }); а можно так: [1,2,3].reduce(function(a, b) { return a+b*b; });
Свежие комментарии