我想检查向量中给出的每个键是否[: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 那样检查关键的一层。我该如何完成上述工作?
我想检查向量中给出的每个键是否[: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 那样检查关键的一层。我该如何完成上述工作?
对 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
这个怎么样:
(every? #(if (vector? %)
(contains? (get-in kvs (drop-last %)) (last %))
(contains? kvs %)) [:e [:a :b] [:c :d]])
以下是这样做的 -
(every? #(get-in kvs %) [[:e] [:a :b] [:c :d]])
任何其他答案也欢迎!