对于这个名为“tables”的嵌套映射,
(def tables
{:tableA {:occupied false :party nil}
:tableB {:occupied true :party nil}
:tableC {:occupied false :party nil}})
我如何过滤并取回以下所示的键:occupied = false?
正确的结果应为(:tableA :tableC)
我可以用“过滤”HOF来做到这一点吗?我应该使用列表理解吗?
答案 0 :(得分:3)
您可以使用keep
轻松完成:
(keep (fn [[k v]] (if-not (:occupied v) k)) tables)
但是,正如您所观察到的,每当您映射/过滤序列时,使用for
通常都是一个很好的解决方案,尤其是在您处理嵌套序列时。
(for [[k v] tables :when (not (:occupied v))] k)
我通常更喜欢使用for
,尤其是当我想在目标项目上使用解构时。在这种情况下,解构很适合将键/值对与[k v]
绑定。
答案 1 :(得分:3)
我不确定您的用例是什么,但我可以建议将您的数据结构化为一组地图吗?集具有某些属性,允许您使用关系代数查询它们,类似于在SQL中查询表的方式。 clojure.set / select函数类似于SQL中的WHERE。
(use 'clojure.set)
(def tables
#{{:table "A" :occupied false :party nil}
{:table "B" :occupied true :party nil}
{:table "C" :occupied false :party nil}})
(select #(= false (:occupied %)) tables)
希望这有帮助!