查找地图是否包含多个键

The*_*au5 6 clojure clojurescript

我是Clojure的新手,我想知道是否有办法测试地图是否有多个键.我注意到contains?只检查一个键

我想做什么:

(def mario 
    {:position {:x 1 :y 2}
     :velocity {:x 2 :y 0}
     :mass 20})

;;Test if mario has a position and a velocity
(contains-many? mario :position :velocity) ;;true

;;Test if mario has a mass and a jump-height
(contains-many? mario :mass :jump-height) ;;false
Run Code Online (Sandbox Code Playgroud)

基本上,是否有像contains-many?clojure库中的函数,如果没有,你将如何实现该contains-many?功能?

小智 18

显示了正确的答案,但我想指出另一个优雅的解决方案,它可以提供有关地图值的知识.当你确定他们是真正的(即:不是nil和不false)时:

(every? m ks)
Run Code Online (Sandbox Code Playgroud)

这是因为map是(一元)函数,它们将相应的值返回给参数.但请注意({:x nil} :x) => nil.


sbe*_*nsu 7

我不知道那样做的任何功能.还需要定义您是希望地图包含每个键还是仅包含某些键.我选择的是每一个情况下,如果你想要的一些版本,只需更换every?some?.

我的直接,未优化的版本是:

(defn contains-many? [m & ks]
  (every? #(contains? m %) ks))
Run Code Online (Sandbox Code Playgroud)

已通过测试:

(deftest a-test
  (testing "Basic test cases"
    (let [m {:a 1 :b 1 :c 2}]
      (is (contains-many? m :a))
      (is (contains-many? m :a :b))
      (is (contains-many? m :a :b :c))
      (is (not (contains-many? m :a :d)))
      (is (not (contains-many? m :a :b :d))))))
Run Code Online (Sandbox Code Playgroud)

编辑:使用noisesmith的建议简化

  • 更简单的版本:`(每个?#(包含?m%)ks)` (6认同)