Html form Hierarchy
웹 어플리케이션의 api를 호출 할 때, 아마도 json 형식으로 주로 호출하다보니 전통적인 html-form-submit 의 인풋 엘리먼트를 위한 함수들은 의외로 상당히 등한시 되는 듯 합니다. 많이 찾아보았는데 없네요.. 그래도 놀이삼아 프로젝트를 굴리는데는 페이지 기반으로 url 을 호출하는것이 아무래도 쉽기에 form-submit 으로 넘겨받은 데이터의 hierarchy 를 (map 만) 분석하는 함수를 만들어 보았습니다.
(defn parse-param [v]
(if (re-matches #"^\d+\.?\d*?" v)
(read-string v)
v))
(defn multi-path->map [m keyseq v]
(if (empty? keyseq)
(parse-param v)
(let [[k & ks] keyseq
node ((keyword k) m)]
(assoc m
(keyword k)
(multi-path->map
(if node
node
{}) ks v)))))
(defn handle-type [m]
(letfn
[(iter [keys values result]
(if (empty? keys)
result
(let [[k & ks] keys
[v & vs] values]
(iter ks vs
(multi-path->map
result
(clojure.string/split k #"\.")
v)))))]
(iter (keys m) (vals m) {})))
> (handle-type {"ab.cd.fff" "3" , "ab.aa" "4", "ab.ab.cc" "5", "ab.cd.bbb" "asdf"})
; => {:ab {:cd {:fff 3, :bbb "asdf"}, :ab {:cc 5}, :aa 4}}