首页 > 解决方案 > Clojure:根据另一个集合查找集合中缺失的记录

问题描述

我有 2 个向量:employ 和 emp-income。我想根据employee循环遍历emp-income以查找所有丢失的记录。在这种情况下,它缺少 id = 2。我想在 emp-income 中创建缺少的记录并将收入设置为上一个记录的收入值。在clojure中最好的方法是什么?

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

从:

(def emp-income
  [{:emp-id 1 :income 1000}
   {:emp-id 3 :income 2000}])

至:

 (def emp-income
      [{:emp-id 1 :income 1000}
       {:emp-id 2 :income 1000}
       {:emp-id 3 :income 2000}])

标签: clojure

解决方案


你可以使用:

(let [emp-id->income (into {} (map (fn [rec] [(:emp-id rec) rec]) emp-income))]
    (reduce (fn [acc {:keys [id]}]
                   (let [{:keys [income]} (or (get emp-id->income id) (peek acc))]
                     (conj acc {:emp-id id :income income})))
                 []
                 employ))

{:emp-id id :income nil}请注意,如果在 中找不到第一条记录,这将创建一条记录emp-income:emp-id如果在 中找到重复:emp-id值,它也会使用最后遇到的emp-income


推荐阅读