如何将键添加到地图/在当前地图clojure中创建键

How to add keys to a map / create keys in current map clojure

我从 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-keys 可以很好地完成这项工作,尽管像 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" ""))

为了让它更加自动化,您可以使用 update-in:

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 库并使用内置的 rename-keys 函数来稍微优雅一些​​:

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" ""))