如何向地图添加关键点/在当前地图clojure中创建关键点

如何向地图添加关键点/在当前地图clojure中创建关键点,clojure,ring,Clojure,Ring,我从get请求中获得了以下映射 :form-params {"qu" ["2015 Q2" "2015 Q3" "2015 Q4" "2015 Q2" "2015 Q3" "2015 Q4" "2015 Q2" "2015 Q3" "2015 Q4" "2015 Q2" "2015 Q3" "2015 Q4"], "sh" ["2580" "2580" "2580" "2983"

我从get请求中获得了以下映射

:form-params {"qu" ["2015 Q2" "2015 Q3" "2015 Q4" "2015 Q2"
                    "2015   Q3" "2015 Q4" "2015 Q2" "2015 Q3"
                    "2015 Q4" "2015 Q2" "2015 Q3" "2015 Q4"],
              "sh" ["2580" "2580" "2580" "2983"
                    "2983" "2983" "53" "53"
                    "53" "4558" "4558" "4558"],
              "prin" ["191" "191" "191" "191"
                      "191" "191" "191" "191"
                      "191" "191" "191" "191"],
              "bu" ["" "" "" "" "" "" "" "" "" "" "" ""]}
我想创建键:quarter、:sh、:prin和:bu。原因是,从这里开始,我要分成4组,并像下面那样交错

 (let [params (:form-params request)
                   data (partition 4 (interleave (:quarter params) (:shiptoid params)
                                                 (:principalid params) (:budget params)
                                                  ))

谢谢

内置函数
clojure.set/rename key
可以很好地实现这一点,尽管与clojure中的所有功能一样,有几种方法。所以,让我们来看看这个过程。你所拥有的非常接近于工作。如果我只是按每个字符串的原始字符串键进行查找,我们可以看到它是有效的:

user> (def request {:form-params {"qu" ["2015 Q2" "2015 Q3" "2015 Q4" "2015 Q2"
                                        "2015   Q3" "2015 Q4" "2015 Q2" "2015 Q3"
                                    "2015 Q4" "2015 Q2" "2015 Q3" "2015 Q4"],
                              "sh" ["2580" "2580" "2580" "2983"
                                    "2983" "2983" "53" "53"
                                    "53" "4558" "4558" "4558"],
                              "prin" ["191" "191" "191" "191"
                                      "191" "191" "191" "191"
                                      "191" "191" "191" "191"],
                              "bu" ["" "" "" "" "" "" "" "" "" "" "" ""]}})
#'user/request
user> (let [params (:form-params request)
            data (partition 4 (interleave (params "qu") (params "sh")
                                          (params "prin") (params "bu")))]
        (clojure.pprint/pprint data))
(("2015 Q2" "2580" "191" "")
 ("2015 Q3" "2580" "191" "")
 ("2015 Q4" "2580" "191" "")
 ("2015 Q2" "2983" "191" "")
 ("2015   Q3" "2983" "191" "")
 ("2015 Q4" "2983" "191" "")
 ("2015 Q2" "53" "191" "")
 ("2015 Q3" "53" "191" "")
 ("2015 Q4" "53" "191" "")
 ("2015 Q2" "4558" "191" "")
 ("2015 Q3" "4558" "191" "")
 ("2015 Q4" "4558" "191" ""))
现在听起来你想要一个和第一个贴图一样的贴图,只是它有不同的键指向相同的值。为了实现这一点,我们可以使用地图文字轻松高效地创建此新地图:

user> (def new-request
        (let [params (:form-params request)]
          {:form-params {:quarter (params "qu")
                         :shiptoid (params "sh")
                         :principalid (params "prin")
                         :budget (params "bu")}}))
#'user/new-request
user> (let [params (:form-params new-request)
            data (partition 4 (interleave (:quarter params) (:shiptoid params)
                                          (:principalid params) (:budget params)))]
        (clojure.pprint/pprint data))
(("2015 Q2" "2580" "191" "")
 ("2015 Q3" "2580" "191" "")
 ("2015 Q4" "2580" "191" "")
 ("2015 Q2" "2983" "191" "")
 ("2015   Q3" "2983" "191" "")
 ("2015 Q4" "2983" "191" "")
 ("2015 Q2" "53" "191" "")
 ("2015 Q3" "53" "191" "")
 ("2015 Q4" "53" "191" "")
 ("2015 Q2" "4558" "191" "")
 ("2015 Q3" "4558" "191" "")
 ("2015 Q4" "4558" "191" ""))
为了使其更加自动化,您可以在中使用
更新:

user> (def new-request
        (update-in request [:form-params]
                   (fn [params] {:quarter (params "qu")
                                 :shiptoid (params "sh")
                                 :principalid (params "prin")
                                 :budget (params "bu")})))
#'user/new-request
user> (let [params (:form-params new-request)
            data (partition 4 (interleave (:quarter params) (:shiptoid params)
                                          (:principalid params) (:budget params)))]
        (clojure.pprint/pprint data))
(("2015 Q2" "2580" "191" "")
 ("2015 Q3" "2580" "191" "")
 ("2015 Q4" "2580" "191" "")
 ("2015 Q2" "2983" "191" "")
 ("2015   Q3" "2983" "191" "")
 ("2015 Q4" "2983" "191" "")
 ("2015 Q2" "53" "191" "")
 ("2015 Q3" "53" "191" "")
 ("2015 Q4" "53" "191" "")
 ("2015 Q2" "4558" "191" "")
 ("2015 Q3" "4558" "191" "")
 ("2015 Q4" "4558" "191" ""))
从clojure 1.7(今天的下一个版本)开始,您还可以使用
update
功能,该功能稍微优雅一些。尽管通过添加clojure.set库并使用内置的
重命名键
功能,这仍然可以稍微优雅一些:

user> (def new-request
        (update request :form-params
                clojure.set/rename-keys {"qu" :quarter
                                         "sh" :shiptoid
                                         "prin" :principalid
                                         "bu" :budget}))
#'user/new-request
user> (let [params (:form-params new-request)
            data (partition 4 (interleave (:quarter params) (:shiptoid params)
                                          (:principalid params) (:budget params)))]
        (clojure.pprint/pprint data))
(("2015 Q2" "2580" "191" "")
 ("2015 Q3" "2580" "191" "")
 ("2015 Q4" "2580" "191" "")
 ("2015 Q2" "2983" "191" "")
 ("2015   Q3" "2983" "191" "")
 ("2015 Q4" "2983" "191" "")
 ("2015 Q2" "53" "191" "")
 ("2015 Q3" "53" "191" "")
 ("2015 Q4" "53" "191" "")
 ("2015 Q2" "4558" "191" "")
 ("2015 Q3" "4558" "191" "")
 ("2015 Q4" "4558" "191" ""))