我遇到问题。所以问题是。
- 我有这样的地图这样的
{:first {"value1" "value2" "value3"...} :second {"value1" "value2" "value3"...}....}
。 - 我有一个功能用参数
(first&value1)
向服务器提出请求并返回一些信息(必须使用每个键及其请求值(first&value1, first&value2 ...second&value1...)
( -
下一步是生成新地图,例如:
{:first {:value1 {subvalue1, subvalue2 ..} :value2 {subvalue2-1,subvalue2-2}} :second {:value3 {:subvalue3-1,:subvalue3-2}..}..}
子值是对每个键及其价值的每个项目提出请求的结果。而且我想再次重复该操作(当我向服务器提出请求时使用3个参数(以获得4次嵌套地图:{first {second {third {fourth}}}}
。也许有人给我有用的建议如何做。
此功能有点漫长,但要做的是要做的事情:
(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
参数应是获取参数集合并返回结果向量的函数。这是选择随机数量随机响应的样本:
(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"]}}}
您可以看到,从请求返回的任何重复值只能在结果映射中表示一次。