筛选clojure中具有可能不同键的映射列表
假设我有一个如下所示的地图列表:筛选clojure中具有可能不同键的映射列表,clojure,Clojure,假设我有一个如下所示的地图列表: (def my-map '({:some-key {:another-key "val"} :id "123"} {:some-key {:another-key "val"} :id "456"} {:some-other-key {:a-different-key "val2"} :id "789"}) 在尝试按另一个键:筛选此地图时,我尝试了以下操作: (filter#(=“val”(((:某个键):另一个键))我的地图)) 但是,这将在
(def my-map '({:some-key {:another-key "val"}
:id "123"}
{:some-key {:another-key "val"}
:id "456"}
{:some-other-key {:a-different-key "val2"}
:id "789"})
在尝试按另一个键:筛选此地图时,我尝试了以下操作:
(filter#(=“val”(((:某个键):另一个键))我的地图))
但是,这将在不包含我正在筛选的键的映射条目上抛出一个NullPointerException
。过滤此映射的最佳方法是什么,排除与过滤的架构不完全匹配的条目?第一次查找键:如果映射键不在映射中,某些键将返回nil
。调用nil
将导致您看到的NPE
解决方案很简单,只需在地图中进行关键字查找,即使给定为零:
(def my-map '({:some-key {:another-key "val"}
:id "123"}
{:some-key {:another-key "val"}
:id "456"}
{:some-other-key {:a-different-key "val2"}
:id "789"}))
(filter #(= "val" (:another-key (% :some-key))) my-map)
您也可以使用进入
:
(filter #(= "val" (get-in % [:some-key :another-key])) my-map)
如果您的列表可能包含nil
项:
(filter #(= "val" (:another-key (:some-key %))) my-map)
说明:
(:k nil);; => nil
(nil :k);; => NPE
({:k 4} :k);; => 4
(:k {:k 4});; => 4
;; BTW, you can also specify the "not found" case:
(:k nil :not-there);; => :not-there
另见