【问题标题】:Idiomatic way to select a map in vector by a key通过键在向量中选择地图的惯用方式
【发布时间】:2015-05-20 22:32:23
【问题描述】:

假设我有这个地图向量:

[{:title "Title1" :id 18347125}
 {:title "Title2" :id 18347123}
 {:title "Title3" :id 18341121}]

我想选择 :id 18347125 的地图,我该怎么做?

我试过了

(for [map maps
      :when (= (:id map) id)]
    map)

这感觉有点难看,返回一个长度为1的序列,我只想返回地图。

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    恕我直言,有几种方法可以解决您的问题,而且绝对惯用的方法是在品味领域。这是我的解决方案,我只是将“选择:id1834715 的地图”翻译成Clojure。

    user> (def xs [{:title "Title1" :id 18347125}
                   {:title "Title2" :id 18347123}
                   {:title "Title3" :id 18341121}])
    #'user/xs
    
    user> (filter (comp #{18347125} :id) xs)
    ({:title "Title1", :id 18347125})
    

    :id 关键字是一个在传递给它的集合中查找自身的函数。集合#{18347125} 也是一个测试传递给它的值是否等于18347125 的函数。使用 Clojure 集合作为谓词函数允许使用简洁的习语。

    【讨论】:

      【解决方案2】:

      这并不能完全满足您的要求,但仍然可能有用:

      user=> (group-by :id [{:title "Title1" :id 18347125}
                            {:title "Title2" :id 18347123}
                            {:title "Title3" :id 18341121}])
      {18347125 [{:title "Title1" :id 18347125}]
       18347123 [{:title "Title2" :id 18347123}]
       18341121 [{:title "Title3" :id 18341121}]}
      

      现在您可以简单地按 id 查找地图。阅读更多关于 group-by on clojuredocs 的信息,这是一个非常有用的功能。

      请注意,它将地图放在向量中。这是因为 group-by 旨在处理分组(即具有相同键的多个项目):

      user=> (group-by :id [{:title "Title1" :id 123}
                            {:title "Title2" :id 123}
                            {:title "Title3" :id 18341121}])
      {123 [{:title "Title1" :id 123} {:title "Title2" :id 123}]
       18341121 [{:title "Title3" :id 18341121}]}
      

      【讨论】:

        【解决方案3】:

        我不确定这是否是最简单的写法,但我认为这更清楚你的意图:

        (->> maps
             (filter #(= (:id %) id))
             first)
        

        【讨论】:

        • 所有好的答案,但我接受这个,因为它直接解决了我的问题。
        【解决方案4】:

        如果您不仅需要查询一次,而且需要多次查询具有特定 ID 的地图,我建议您使您的数据类型与您的用例相匹配,即将矢量更改为地图:

        (def maps-by-id (zipmap (map :id maps) maps))
        

        所以现在您的 ID 是这个新地图中的键:

        user=> (maps-by-id 18347125)
        {:title "Title1", :id 18347125}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-28
          • 1970-01-01
          • 1970-01-01
          • 2017-06-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-08
          相关资源
          最近更新 更多