【问题标题】:Clojure: Merge 2 vectors of mapsClojure:合并 2 个地图向量
【发布时间】:2019-12-22 06:28:15
【问题描述】:

我有 2 个地图向量:employ-base 和employ1。我想合并employ1 的优先级高于employ-base 的2 个向量。因此,如果employ1 有记录使用它们,则使用来自employ-base 的记录。在 clojure 中最好的方法是什么?

来自:

(def employ-base
  [{:id 1 :name "Aaron" :income 0}
   {:id 2 :name "Ben" :income 0}
   {:id 3 :name "Carry" :income 0}])

(def employ1
  [{:id 1 :name "Aaron" :income 1000}   
   {:id 3 :name "Carry" :income 2000}]) 

到:

(def employ1
  [{:id 1 :name "Aaron" :income 1000}
   {:id 2 :name "Ben" :income 0}
   {:id 3 :name "Carry" :income 2000}]) 

【问题讨论】:

  • 您最近的两个问题(实际上,现在我看,您最近提出的另外两个问题)都遵循相同的主题:事情很困难,因为您使用了错误的数据结构。您可以说出来,因为您收到的问题答案涉及立即将数据放入地图中,以 id 为键,这是一种更方便的格式。如果你事先这样做,各种转换都会变得容易得多。
  • 我试图简化问题,真正的地图没有 ID。地图中没有唯一的键。类似于: (defemploy1 [{:fname "Aaron" :lname "Smith" :income 1000} {:fname "Carry" :lname "Smith" :income 2000}])
  • 在您的问题中,“如果employ1 有记录”这句话不清楚。 “有”是什么意思?他们平等吗?只有:id 相等吗? :id:name 的组合是否相等?或者从您的评论中,它是:fnamelname 的组合,还是其中之一?根据您的需要,解决方案的外观会有所不同。

标签: clojure


【解决方案1】:

假设:id 对每个员工都是唯一的,您可以按:id 对地图进行分组,然后按:id 合并每个地图分组:

(map
 #(apply merge (val %))
 (merge-with concat
             (group-by :id employ-base)
             (group-by :id employ1)))
=> ({:id 1, :name "Aaron", :income 1000}
    {:id 2, :name "Ben", :income 0}
    {:id 3, :name "Carry", :income 2000})

合并的优先级通过合并employ1 employe-base 来维护,因为mergemerge-with 更喜欢最右边的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多