繁体   English   中英

clojure:如何合并这两张地图?

[英]clojure: how can I merge these two maps?

我有一个 map 看起来像

{:a {:b {:c {:d [[1 2 3]]}
         :e "Hello"}}}

另一个 map 看起来像{:a {:b {:c {:d [[4 5 6]]}}}} 我怎样才能合并这两个地图,使结果看起来像这样?

{:a {:b {:c {:d [[1 2 3] [4 5 6]]}
         :e "Hello"}}}

对于这样一个简单的用例,您可以选择坚持使用核心 Clojure 函数:

(ns tst.demo.core
  (:use demo.core tupelo.core tupelo.test))

(dotest
  (let [x    {:a {:b {:c {:d [[1 2 3]]}
                      :e "Hello"}}}
        y    {:a {:b {:c {:d [[4 5 6]]}}}}

        yseq (get-in y [:a :b :c :d])

        r1   (update-in x [:a :b :c :d] into yseq)

        r2   (update-in x [:a :b :c :d] #(into % yseq)) ]

        (is= r1 r2
          {:a {:b {:c {:d [[1 2 3]
                           [4 5 6]]},
                   :e "Hello"}}})))

r2所示,我有时认为使用自包含闭包 function 来明确显示旧值%的使用位置会更清楚。 我通常更明确,将 r2 闭包写为:

(fn [d-val]
  (into d-val yseq))

而不是使用#(...)阅读器宏。

您可以使用已弃用的clojure-contrib.map-utils中的deep-merge-with

(defn deep-merge-with [f & maps]
  (apply
    (fn m [& maps]
      (if (every? map? maps)
        (apply merge-with m maps)
        (apply f maps)))
    maps))

(def m1
  {:a {:b {:c {:d [[1 2 3]]}
           :e "Hello"}}})

(def m2
  {:a {:b {:c {:d [[4 5 6]]}}}})

(deep-merge-with into m1 m2)
;; => {:a {:b {:c {:d [[1 2 3] [4 5 6]]}
;;             :e "Hello"}}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM