3

我想检查向量中给出的每个键是否[: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]]) 

但是,上面的操作会失败,因为 contains 不会像 update-in 那样检查关键的一层。我该如何完成上述工作?

4

3 回答 3

3

对 murtaza 基本方法的改进,当地图具有 nil 或 false 值时也适用:

(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
于 2013-03-21T06:19:44.763 回答
1

这个怎么样:

(every? #(if (vector? %)
           (contains? (get-in  kvs (drop-last %)) (last %))
           (contains? kvs %)) [:e [:a :b] [:c :d]]) 
于 2013-03-21T05:38:58.713 回答
1

以下是这样做的 -

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

任何其他答案也欢迎!

于 2013-03-21T05:33:48.400 回答