筛选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
另见