在Clojure中找出一个集合是否包含具有给定键值的映射的最简单方法是什么?
我真的很喜欢使用,contains?因为它非常简洁易读。我想看看一个集合是否包含具有与示例相同的键和值对的映射,该示例还具有其他键值对。我很确定contains?不会在这里工作。有替代方案吗?也许我必须写一篇(我终于进入了心态!)。例如,如果我有
(def some-set #{{:foo "bar" :beep "boop"}{:foo "bar"} {:foo "bar" :hi "there"}})
这将是一个快速的方法来知道是否有任何地图匹配{:foo "bar" :one "two"}上:foo "bar"?
回答
编辑:记住映射是键值向量的集合,这里是谓词的实现submap?:
(defn submap?
"Returns true if subm is a submap of m, false otherwise."
[subm m]
(every? (fn [[k v]] (= (get m k ::not-found) v)) subm))
此谓词可用于过滤任何集合:
(filter #(submap? {:a 1 :b 2} %) [{:a 1} {:a 1 :b 2 :c 3}])
=> ({:a 1, :b 2, :c 3})
原答案
此解决方案有效,但比我更新的答案慢,因为(set m)for large的构造m
(defn submap?
"Returns true if subm is a submap of m, false otherwise."
[subm m]
(let [kvs (set m)]
(every? kvs subm)))
THE END
二维码