2

对于这个名为“tables”的嵌套地图,

  (def tables 
   {:tableA {:occupied false :party nil} 
    :tableB {:occupied true :party nil}
    :tableC {:occupied false :party nil}})

如何过滤并取回 :occupied = false 的密钥?

正确的结果应该是(:tableA :tableC)

我可以用“过滤器”HOF 做到这一点吗?我应该使用列表理解吗?

4

2 回答 2

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

于 2013-11-10T04:01:50.420 回答
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)

希望这可以帮助!

于 2013-11-10T12:08:14.420 回答