【问题标题】:what is the idiomatic way to slice a map in Clojure?在 Clojure 中切片地图的惯用方法是什么?
【发布时间】:2013-02-26 05:59:58
【问题描述】:

对于列表和向量,我们可以对序列进行切片并获取我们想要的任何部分。 如何对映射对象做类似的操作?

例如,我有一个地图对象列表,

(def plays [
        {:name "Burial",     :plays 979,  :loved 9}
        {:name "Eno",        :plays 2333, :loved 15}
        {:name "Bill",       :plays 979,  :loved 9}
        {:name "Magma",      :plays 2665, :loved 31}])

对于每张地图,我想切掉播放列,并添加具有默认值的速率列,这样做的惯用方法是什么?

【问题讨论】:

    标签: map clojure standard-library


    【解决方案1】:

    assocdissoc 在这种情况下是你的朋友:

    (map #(-> % (dissoc :plays) 
                (assoc :rate 10)) plays)
    

    【讨论】:

      【解决方案2】:

      根据您的用例,除了assocdissoc,您可能还会发现select-keys 有用:

      clojure.core/select-keys
      ([map keyseq])
        Returns a map containing only those entries in map whose key is in keys
      
      (select-keys {:name "Eno" :plays 2333 :loved 15} [:name :loved])
      ;; => {:name "Eno" :loved 15}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-04
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 2012-04-26
        • 2011-03-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多