我想检查一个向量[: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那样检查密钥的一个级别。我如何完成上述工作?
答案 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]])