Я работал с некоторыми примерами функционального программирования JavaScript, когда наткнулся на метод reduce. По определению сокращение используется для перебора массива и его сжатия в одно значение.

Это заставило меня задуматься, в чем разница с программной точки зрения между сокращением и традиционным циклом for?

Вот пример работы метода reduce:

var array = [4,5,6,7,8];
var singleVal = 0;
var singleVal = array.reduce(function(previousVal, currentVal) {
  return previousVal + currentVal;
}, 0);

В приведенном выше шаблоне хранится значение, возвращаемое методом уменьшения. Метод reduce получает функцию обратного вызова с параметрами previousVal и currentVal. По мере итерации массива все элементы складываются вместе.

Вот тот же ввод, но с циклом for

var array = [4,5,6,7,8];
var singleVal = 0;
for(var i = 0; i < array.length; i++){
  var singleVal = singleVal += array[i];
}

Тот же результат достигается с помощью цикла for. Для каждого прохода элемент или массив [i] в ​​этом случае добавляется и сохраняется в singleVal.

Поэтому я решил протестировать два алгоритма и посмотреть, какой из них работает лучше. Вот результаты с jsPerf.com

Как видите, цикл for превзошел метод уменьшения, когда размер выборки был относительно небольшим. В качестве альтернативы, метод уменьшения выполнял цикл for, когда размер выборки был больше.

Результаты тестов показали мне преимущества использования одного над другим на основе вводимых данных, однако они не объяснили программную разницу, которую я искал. Поэтому я решил продолжить поиски…

В конце концов я нашел ответ!

Reduce в JavaScript - это псевдоним для Fold, функции более высокого порядка, которая анализирует рекурсивную структуру данных и посредством использования заданной операции комбинирования рекомбинирует результаты рекурсивной обработки ее составных частей, создавая возвращаемое значение. Проще говоря, элементы комбинируются таким образом, чтобы отражать комбинацию со следующим элементом, и так далее, пока не будут исчерпаны все элементы.

Складки, карты используются для независимого преобразования каждого значения структуры данных, а фильтры используются для исключения некоторых элементов из структуры данных. Использование циклов for как мастера на все руки имеет тенденцию скрывать фактическую операцию, выполняемую циклом. Таким образом, с точки зрения программирования, сокращение более красноречиво и ясно по своему назначению.

Таким образом, мы можем определить различия между двумя подходами в зависимости от ввода и паттерна проектирования программиста.

Удачного кодирования!

Если вас интересует мой технический контент, подпишитесь на меня @nspiredTech в Twitter и Dev.to