简体   繁体   中英

Clojure: Find missing records in a collection based on another collection

I have 2 vectors: employ and emp-income. I want to loop thru emp-income based on employ to find what all the missing records. In this case, it's missing id = 2. And i want to create the missing record in emp-income and set the income as the previous record's income value. What is the best way to do it in clojure?

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

from:

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

to:

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

You could use:

(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))

Note this will create a record of {:emp-id id :income nil} if the first record is not found in emp-income . It will also use the last :emp-id encountered if duplicate :emp-id values are found within emp-income .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM