假设您有一个结构为{id:1,type:'A',value:10}的对象数组,想要查找类型A,类型B和类型C的总数。
初始化总变量然后循环遍历一次数组,然后根据类型添加总变量,比对每个总数使用reduce函数实际上遍历数组3次要有效。 / p>
但是,据我从函数式编程范例中了解到的那样,函数不应在其内部范围之外进行任何操作,函数应仅具有一个目的,因此后一种方法将是首选。
方法1:为三种类型中的每种类型初始化一个变量,循环一次,然后根据类型将其添加到每个总数中
方法2:对每种总类型使用reduce函数。
首选哪个?
答案 0 :(得分:2)
如果您使用包含三个值作为状态的记录,则可以使用单次折叠/减少。在Clojure中:
(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})
请注意,这会改变累加器记录的位置。