如何在Clojure中过滤含指定键的:sellers集合并更新原Map
解决方法
首先调整你的校验函数,让它直接返回布尔值表示卖家是否合法:
(:require [validateur.validation :as v]) (def my-map {:buyers [{:name "James" :city "Berlin"} {:name "Jane" :city "Milan"}] :sellers [{:name "Dustin" :city "Turin" :age "21"} {:name "Dustin" :city "Milan" :age "" } {:city "Rome" :age "22"}]}) (defn valid-seller? [mp] (let [v-set (v/validation-set (v/presence-of #{:name :city :age}))] ;; 校验结果为空Map表示没有错误,即该卖家合法 (empty? (v-set mp))))
接下来用update函数修改原Map的:sellers字段,过滤掉不合法的子Map:
(def filtered-map (update my-map :sellers #(filter valid-seller? %)))
运行后filtered-map的结果就是你需要的结构:
{:buyers [{:name "James" :city "Berlin"} {:name "Jane" :city "Milan"}] :sellers [{:name "Dustin" :city "Turin" :age "21"}]}
原理说明
valid-seller?通过validateur的校验集,检查卖家Map是否同时存在:name、:city、:age三个键且对应值非空,校验返回的错误Map为空时说明合法。update函数专门用于修改Map中的指定键,这里我们对:sellers对应的列表执行filter操作,只保留合法的卖家子Map。
内容的提问来源于stack exchange,提问作者Razz
相关产品推荐
相关产品推荐

