如何在Clojure循环的case语句中生成统一复合Map结构
解决Clojure生成GA4复合过滤规则的问题
核心思路
把循环生成的单个过滤规则批量收集,再根据业务需求包裹进andGroup或orGroup结构——GA4规则中,andGroup下所有规则需同时满足,orGroup下规则满足任意一个即可。
示例实现
1. 单个规则生成函数
保留原有case逻辑生成单维度过滤规则:
(defn generate-single-filter [dimension value] (case dimension "country" {:filterType "INCLUDE" :field "country" :stringFilter {:matchType "EXACT" :value value}} "deviceCategory" {:filterType "INCLUDE" :field "deviceCategory" :stringFilter {:matchType "EXACT" :value value}} "source" {:filterType "EXCLUDE" :field "source" :stringFilter {:matchType "CONTAINS" :value value}}))
2. 批量生成复合过滤结构
用map收集所有规则,再按需求组合成AND/OR分组:
(defn generate-complex-filter [rules group-type] (let [filters (map #(apply generate-single-filter %) rules)] (case group-type :and {:andGroup {:filters filters}} :or {:orGroup {:filters filters}}))) ;; 示例调用 (def sample-rules [["country" "US"] ["deviceCategory" "mobile"] ["source" "google"]]) ;; 生成AND组合规则 (generate-complex-filter sample-rules :and) ;; 生成OR组合规则 (generate-complex-filter sample-rules :or)
3. 嵌套组合(AND包含OR)
如果需要多层嵌套,比如部分规则先做OR组合,再和其他规则做AND组合,直接嵌套构造即可:
(def nested-filter {:andGroup {:filters [(generate-single-filter "country" "US") {:orGroup {:filters [(generate-single-filter "deviceCategory" "mobile") (generate-single-filter "deviceCategory" "tablet")]}}]}})
预期输出示例
调用(generate-complex-filter sample-rules :and)会得到如下结构:
{:andGroup {:filters [{:filterType "INCLUDE" :field "country" :stringFilter {:matchType "EXACT" :value "US"}} {:filterType "INCLUDE" :field "deviceCategory" :stringFilter {:matchType "EXACT" :value "mobile"}} {:filterType "EXCLUDE" :field "source" :stringFilter {:matchType "CONTAINS" :value "google"}}]}}
内容的提问来源于stack exchange,提问作者Deepak Kishore
相关产品推荐
相关产品推荐

