我遇到了一个问题。所以问题是。
{:first {"value1" "value2" "value3"...} :second {"value1" "value2" "value3"...}....}这样的地图。(first&value1)向服务器发出请求并返回一些信息(它必须使用每个键及其值(first&value1, first&value2 ...second&value1...)进行请求)。子值是使用每个键及其值的每个项发出请求的结果。我想再次重复这个操作(当我向服务器提出请求时使用3个参数),以实现4次嵌套映射:{first {second {third {fourth}}}}。也许有人能给我一些有用的建议。
发布于 2017-06-01 03:20:47
这个函数有点长,但是做您需要它做的事情:
(defn rec-update
[m f]
(let [g (fn g [m args]
(into {}
(for [[k v] m]
(if (instance? java.util.Map v)
[k (g v (conj args (name k)))]
[k (into {} (map #(let [args (into args [(name k) (name %)])]
[(keyword %) (f args)])
v))]))))]
(g m [])))f参数应该是一个函数,它接受一个params集合,并返回一个结果向量。下面是一个随机选择随机响应数的示例:
(defn make-request
[params]
(vec (repeatedly (+ 1 (rand-int 3)) #(rand-nth ["r1" "r2" "r3"]))))虽然下面的示例没有演示,但是给这个函数的params实际上是嵌套的值。
使用:
(def m {:first ["val1" "val2" "val3"], :second ["val4" "val5"]})
(rec-update m make-request)
=>
{:first {:val1 ["r2" "r2" "r3"], :val2 ["r2" "r2"], :val3 ["r1" "r3"]},
:second {:val4 ["r3" "r3"], :val5 ["r2" "r1"]}}在结果上再次运行它:
(rec-update *1 make-request)
=>
{:first {:val1 {:r2 ["r1" "r3" "r2"], :r3 ["r3" "r2"]},
:val2 {:r2 ["r1" "r1"]},
:val3 {:r1 ["r2"], :r3 ["r1" "r2" "r3"]}},
:second {:val4 {:r3 ["r3" "r2"]}, :val5 {:r2 ["r1"], :r1 ["r2" "r3"]}}}如您所见,从请求返回的任何重复值将只在结果映射中表示一次。
https://stackoverflow.com/questions/44294383
复制相似问题