如何检查地图中是否存在嵌套键

时间:2013-03-21 05:22:09

标签: clojure

我想检查一个向量[:e [:a :b] [:c :d]]中给出的每个键是否都存在于地图中。

{:e 2 :a {:b 3} :c {:d 5}}

我可以写下面的内容来检查 -

(def kvs {:e 2 :a {:b 3} :c {:d 5}})    
(every? #(contains? kvs %) [[:e] [:a :b] [:c :d]]) 

但是上面的内容会失败,因为包含并不像update-in那样检查密钥的一个级别。我如何完成上述工作?

3 个答案:

答案 0 :(得分:3)

murtaza基本方法的改进,当地图有零或假值时也可以使用:

(defn contains-every? [m keyseqs]
  (let [not-found (Object.)]
    (not-any? #{not-found}
              (for [ks keyseqs]
                (get-in m ks not-found)))))

user> (contains-every? {:e 2 :a {:b 3} :c {:d 5}}
                       [[:e] [:a :b] [:c :d]])
true
user> (contains-every? {:e 2 :a {:b 3} :c {:d 5}}
                       [[:e] [:a :b] [:c :d :e]])
false

答案 1 :(得分:1)

以下是 -

(every? #(get-in kvs %) [[:e] [:a :b] [:c :d]]) 

欢迎任何其他答案!

答案 2 :(得分:1)

这个怎么样:

(every? #(if (vector? %)
           (contains? (get-in  kvs (drop-last %)) (last %))
           (contains? kvs %)) [:e [:a :b] [:c :d]])