Скажем, у вас есть массив объектов со структурой вроде {id: 1, type: 'A', value: 10}, и вы хотите найти сумму типов A, B и C.
Было бы более эффективно инициализировать итоговые переменные, а затем пройтись по массиву один раз, добавляя итоговые переменные на основе типа, чем использовать функцию сокращения для каждого итога, фактически проходя по массиву 3 раза.
Однако из того, что я понимаю из парадигмы функционального программирования, функции не должны манипулировать чем-либо за пределами своей внутренней области, а функции должны иметь только одну цель, поэтому последний подход был бы предпочтительнее.
Подход 1: инициализировать переменную для каждого из трех типов, зациклить один раз и добавить к каждой сумме в зависимости от типа.
Подход 2: используйте функцию сокращения для каждого общего типа.
Какой из них предпочтительнее?
"Было бы эффективнее…" - что именно заставляет вас так думать? Сложность времени выполнения линейна в любом решении.
@Bergi, более эффективно перебирать массив только один раз, а не три раза.
@Ли, я использую Javascript. Я не знаю метода сокращения, который возвращает три значения.
@StevenAnderson 3 цикла с 1 оператором в теле так же эффективны, как 1 цикл с 3 операторами в теле.
@StevenAnderson Lee говорит об использовании {totalA: 0, totalB: 0, totalC: 0} в качестве аккумулятора reduce


Вы можете использовать одну складку/уменьшение, если используете запись, содержащую три значения, в качестве состояния, например. в кложуре:
(defn sum-inputs [inputs]
(reduce (fn [acc {:keys [type value]}]
(update acc (keyword type) + value))
{:A 0 :B 0 :C 0}
inputs))
тогда
(sum-inputs [{:id 1 :type "A" :value 10}
{:id 2 :type "B" :value 12}
{:id 3 :type "B" :value 7}
{:id 4 :type "C" :value 40}])
в Javascript похоже, что вы можете использовать Array.reduce:
const input = [{id: 1, type: "A", value: 4}, {id: 2, type: "B", value: 3}, {id: 3, type: "B", value: 9}, {id: 4, type: "C", value: 2}]
input.reduce(function(acc, i) { acc[i.type] += i.value; return acc; }, {A: 0, B: 0, C: 0})
обратите внимание, что это изменяет запись аккумулятора на месте.
Спасибо, Ли. Я использую Javascript. Я не знаю метода сокращения, который возвращает три значения.
@StevenAnderson - существует только одно значение, запись, содержащая три значения. Я обновил пример для Javascript.
Это имеет смысл, Ли, теперь я вижу это! Спасибо.
Какой язык вы используете? Вы можете уменьшить запись, содержащую три значения, если хотите избежать многократных проходов.