【问题标题】:Does clojure have a merge-if-exists function?clojure 是否具有合并如果存在的功能?
【发布时间】:2019-03-12 05:30:58
【问题描述】:

clojure 是否有 merge-if-exists 函数来合并两个映射, 喜欢

(defn merge-if-exists [map1 map2])

返回一个包含map1的所有key的新map,如果一个key出现在多个map中,则使用map2这个key的值作为返回map值,否则使用map1的值。

例如

(merge-if-exists {:a 1 :b 2} {:b 3})
;=> {:a 1, :b 3}

(merge-if-exists {:a 1 :b 2} {:c 3})
;=> {:a 1, :b 2}

(merge-if-exists{:b 3} {:a 1 :b 2})
;=> {:b 2}

这个函数怎么写?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    您可以使用mergeselect-keys 来定义它:

    (defn merge-if-exists [m1 m2]
      (merge m1 (select-keys m2 (keys m1))))
    
    (merge-if-exists {:a 1 :b 2} {:b 3})
    => {:a 1, :b 3}
    (merge-if-exists {:a 1 :b 2} {:c 3})
    => {:a 1, :b 2}
    (merge-if-exists {:b 3} {:a 1 :b 2})
    => {:b 2}
    

    或者使用reduce-kv的更快/更高效的版本:

    (defn merge-if-exists [m1 m2]
      (reduce-kv
       (fn [m k v]
         (assoc m k (if-let [r (find m2 k)]
                      (val r)
                      v)))
       {}
       m1))
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      (defn merge-keep-left [left right]
        (select-keys (merge left right) (keys left)))
      

      此功能来自Mark Needham 的帖子。他还在博文中展示了替代实现。

      【讨论】:

        猜你喜欢
        • 2020-11-20
        • 1970-01-01
        • 2012-07-26
        • 2010-09-07
        • 1970-01-01
        • 2022-12-25
        相关资源
        最近更新 更多