1

入力:

List of keys: [ :name :address :work]
Map 1: { :name "A" :address "A Street" }
Map 2: { :work "Work Ave" }

出力:

([:name "A" nil] [:address "A Street" nil] [:work nil "Work Ave"])

これは私が現在持っているものです:

(defn maps-iterate [v & ms]
    (map (fn [k] (into [] [k #(map (k %) ms)])) v))

(println (maps-iterate [ :name :address :work ] { :name "A" :address "A Street"} { :work "Work Ave" }))

それは私に与えます:

([:name #<user$maps_iterate$fn__2$fn__3 user$maps_iterate$fn__2$fn__3@4b14b82b>] 
 [:address #<user$maps_iterate$fn__2$fn__3 user$maps_iterate$fn__2$fn__3@3d47358f>] 
 [:work #<user$maps_iterate$fn__2$fn__3 user$maps_iterate$fn__2$fn__3@e0d5eb7>])
4

4 に答える 4

2

試す

(defn maps-iterate [v & ms]
    (map (fn [k] (into [] [k (map #(k %) ms)])) v))

またはさらに良い:

(defn maps-iterate [v & ms]
    (map (fn [k] (cons k (map k ms))) v))

注:すべてのキーがキーワードの場合、関数として使用できます:(map k ms)の代わりに(map #(k %) ms)。そうでない場合は、関数として使用できません。あなたは書く必要があります(map #(% k) ms)

于 2012-06-22T07:21:06.573 に答える
1

これはどう?

(for [k ks]
  [k (map k [m1 m2])])
;;=> ([:name ("A" nil)] [:address ("A Street" nil)] [:work (nil "Work Ave")])

または、結果にフラットなベクトルが本当に必要な場合:

(for [k ks]
  (apply vector k 
         (map k [m1 m2])))
;;=> ([:name "A" nil] [:address "A Street" nil] [:work nil "Work Ave"])
于 2012-06-22T07:56:45.807 に答える
1
user=> (def a { :name "A" :address "A Street" })
#'user/a
user=> (def b { :work "Work Ave" })
#'user/b
user=> (def c [ :name :address :work])
#'user/c
user=> (map #(vector %1 (%1 a) (%1 b)) c)
([:name "A" nil] [:address "A Street" nil] [:work nil "Work Ave"])
于 2012-06-22T08:25:37.743 に答える
-1

次のREPLの例では、nil値が示されていない出力が生成されます。

user> (def map1 { :name "A" :address "A Street" })
#'user/map1
user> (def map2 { :work "Work Ave" })
#'user/map2
user> (seq (merge map1 map2))
([:work "Work Ave"] [:name "A"] [:address "A Street"])
于 2012-06-22T07:23:20.020 に答える