我需要实现一个函数,采用两个地图向量并返回一种组合的一个地图向量。详情如下:
输入 1: [{:id 1 :car "A" :price 10}{:id 2 :car "B" :price 20}{:id 3 :car "C" :price 30}]
输入 2: [{:id 4 :car "A" :price 5}{:id 5 :car "B" :price 30}{:id 6 :car "D" :price 40}]
输出: [{:id 4 :car "A" :price 5} {:id 2 :car "B" :price 20} {:id 3 :car "C" :price 30} {:id 6 :car "D" :price 40}]
也就是说,如果:car
相同,则取价格的最小值,或直接添加到输出中:id
。
我曾考虑使用 map 来获取每个值以在嵌套循环中进行比较,但我认为这不是一个很好的方法。然后我学习了clojure.walk和juxt 之类的东西,但它们看起来很花哨,需要更多解释。
我认为另一个可能的抽象解决方案是将它们连接在一起,并使用标志检查矢量中的每个地图来检查价格。拿起最小的并移除较大的。
我希望你能帮助我,非常感谢你!
一种方法是将项目分组:car
,然后找到每个组的最低价格值:
user> (->> (concat data1 data2)
(group-by :car)
vals
(map #(apply min-key :price %)))
;;=>({:id 4, :car "A", :price 5} {:id 2, :car "B", :price 20} {:id 3, :car "C", :price 30} {:id 6, :car "D", :price 40})
你也可以用 一次性完成reduce
,这有点冗长,但应该有更好的性能:
(defn process [& colls]
(vals (reduce (fn [acc {car :car :as item}]
(if (acc car)
(update acc car (partial min-key :price) item)
(assoc acc car item)))
{}
(apply concat colls))))
user> (process data1 data2)
;;=> ({:id 4, :car "A", :price 5} {:id 2, :car "B", :price 20} {:id 3, :car "C", :price 30} {:id 6, :car "D", :price 40})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句