哪种方法可以更紧密地找到多个总数,遵循函数编程范例?

时间:2019-02-23 16:01:40

标签: functional-programming

假设您有一个结构为{id:1,type:'A',value:10}的对象数组,想要查找类型A,类型B和类型C的总数。

初始化总变量然后循环遍历一次数组,然后根据类型添加总变量,比对每个总数使用reduce函数实际上遍历数组3次要有效。 / p>

但是,据我从函数式编程范例中了解到的那样,函数不应在其内部范围之外进行任何操作,函数应仅具有一个目的,因此后一种方法将是首选。

方法1:为三种类型中的每种类型初始化一个变量,循环一次,然后根据类型将其添加到每个总数中

方法2:对每种总类型使用reduce函数。

首选哪个?

1 个答案:

答案 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})

请注意,这会改变累加器记录的位置。