问题描述
我正在下面的Clojure中寻找一种很好的声明性方式进行数据转换。我完全可以利用那里的任何数据转换库,但希望提出建议。我研究了Meander,Tracks,DataScript等,但找不到最合适的方法。 随着输入数据的复杂性/嵌套的增长,Vanilla Clojure变得非常难看,并且变得势在必行。
;; my input data
(def db {:items [{:id 1 :labels [1 2 3]}
{:id 2 :labels [2]}
{:id 3 :labels []}
{:id 4 :labels nil}
{:id 5 }]
:labels [{:id 1 :name "one"}
{:id 2 :name "two"}
{:id 3 :name "three"}
{:id 4 :name "four"}]})
;; what to do here
(defn flatten-labels [d]
???)
;; so that I get this
(flatten-labels db)
;; =>
;; {:items
;; [{:id 1 :labels ["one" "two" "three"]}
;; {:id 2 :labels ["two"]}
;; {:id 3 :labels []}
;; {:id 4 :labels []}
;; {:id 5 :labels []}]}
编辑:
(defn flatten-labels [{:keys [items labels]}]
(let [->indexed-maps-by (fn [v idx]
(into {} (map #(hash-map (get % idx) %)) v))
label-db (->indexed-maps-by labels :id)
label-lookup (fn [lid] (get-in label-db [lid :name]))
]
(map #(update % :labels (fn [lids] (mapv label-lookup lids))) items)
)
)
这是我的普通解决方案,仅供参考。 差不多,我正在以正确的形状构造一个“查找表”,然后(映射...(更新...(映射...)))来转换嵌套序列的元素。
我主要担心的是,这是一步一步的当务之急,如果我能以声明性的方式表达相同的成形/变换,那将有望使其更易于更改并且更易于概括具有这种“通过某处的某个键解析某些东西并将其拖到此处”情况的更复杂的数据集。
感谢到目前为止的所有建议,高度赞赏!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)