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; });