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


以上是在Clojure中找出一个集合是否包含具有给定键值的映射的最简单方法是什么?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>