我有两种情况说明如何格式化正在使用的数据:
情况1:
{:key ["val1" "val2" "val3"]}
情况2:
{:key {"Title1" ["Val1" "Val2"] "Title2" ["Val3" "Val4"] "Title3" []}}
我想要的是确定案例并使用基于案例的数据进行处理。
这是我所拥有的:
(let [val {"Produkt" ["bla" "blub"] "Test" ["12" "34" "45"]}]
(cond
(not (= (some map? val) nil))
(for [v val]
(str v ", "))
:else
(for [v val]
(do (first v)
(for [c (second v)]
(str c ", "))))))
输出的格式不正确。我必须删除sscce的一些代码。情况2的输出应如下所示:
("Produkt" ("12, " "34, " "45, ") "Test" ("bla, " "blub, "))
情况1的输出应如下所示:
("val1" "val2" "val3")
问题在于,对于情况2,该功能当前正常工作(此sscce中的格式问题除外),但对于情况1则不然。对于情况1,它仅打印出键的第一个字母。我认为这是因为检查条件后它会跳到else块,但是我不知道如何找到更好的条件来解决我的问题。
谢谢你的帮助。
一种简化此方法的好方法是使用multimethod。根据实际数据的表示方式,多方法的分派函数可以像调用type
输入一样简单,可能的分派值类似于clojure.lang.PersistentArrayMap
和clojure.lang.PersistentVector
。较安全的调度方法将允许使用其他类型的顺序集合(例如列表和Java数组)以及其他类型的关联集合(例如排序的映射)。您可以执行以下操作:
(defmulti foo (juxt map? sequential?))
(defmethod foo [true false] ; input is a map of some sort
[val]
(mapcat (fn [[k vs]] [k (apply str (interpose ", " vs))]) val))
(defmethod foo [false true] ; input is a list, vector, etc.
[val]
(apply str (interpose ", " val)))
(foo {"Produkt" ["bla" "blub"] "Test" ["12" "34" "45"]})
;=> ("Produkt" "bla, blub" "Test" "12, 34, 45")
(foo ["val1" "val2" "val3"])
;=> "val1, val2, val3"
这些与您在问题中给出的输出不完全相同,因为这让我有些困惑,您的代码到底想完成什么,但是希望这至少说明了如何为不同类型的参数分派不同的代码使用多种方法很容易做到。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句