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]]) 

ただし、update-in のように 1 レベル深いキーをチェックしないため、上記は失敗します。上記を達成するにはどうすればよいですか?

4

3 に答える 3

3

マップに 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? #(get-in kvs %) [[:e] [:a :b] [:c :d]]) 

他の答えも歓迎します!

于 2013-03-21T05:33:48.400 に答える
1

これはどう:

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