我们有一些这样的数据:
(def x {:title ["NAME" "CODE" "ORDER" "MIN" "MAX" "IMG"]
:show-in-list [true true true true false false]
:key [:name :code :order :min :max :image]
:input-type [:txt :txt :num :num :num :img]
:value [nil nil nil nil nil nil]
:required [true true false false false false]})
我们想用:required
的布尔值过滤这些值,结果是:
{:title ["TITLE" "CODE"],
:show-in-list [true true],
:key [:part_name :part_code],
:input-type [:txt :txt],
:value [nil nil],
:required [true true]}
这是一个简单明了的暴力破解尝试:
(def x ...)
(into {}
(map
(fn [[k vals]]
[k (->> (map #(when %1 %2) (:required x) vals)
(remove nil?)
vec)])
(dissoc x :required)))
这里是此概念的另一种(功能)语言实现的文档:Pick, from Mathematica)
(defn bar [state [v r]]
(if r
(conj state v)
state))
(defn foo [req]
(fn [state [k v]]
(let [a (map #(vector %1 %2) v req)
b (reduce bar [] a)]
(assoc state k b))))
(reduce (foo (:required x)) {} x)