这是我在这里问的另一个问题的后续,我得到了一个很棒的答案。这个问题的前提稍微修改了一下,以允许这个问题。
如何为'name'和'value'生成具有:td
's的表行,如此数据结构所示:
(table-rows [{:name "foo" :value 1} {:name "hey" :value 2}])
开始(defn table-rows [data]
(->> data
(map (fn [{:keys [name] :as row}]
[:td (:name row)]))
(into [:tr])))
在此时返回
=> [:tr [:td "foo"] [:td "hey"]]
映射(fn...)
将只返回最后一个元素,对吗?如果我把两个[:td]
包在某个东西里,这样它就会作为一个单位返回,这个表就不能工作了。
在我的项目中,我将有更多的[:td...]
元素多于两个;我选择了两个来简化我的问题。
我怀疑let
是我应该考虑的,但每次我开始沿着这条路走下去,我都会遇到麻烦,所以我想我应该问一下。
更新:
评论中的一个问题让我意识到这就是我想要的:
(->> data
(map (fn [{:keys [name] :as row}]
[:tr
[:td (:name row)]
[:td (:value row)]]))
(into [:tbody])))
生成我想要的结果:
[:tbody [:tr [:td "foo"] [:td 1]]
[:tr [:td "hey"] [:td 2]]]
谢谢你的帮助!
更新2:
,我意识到我可以从'fn'的参数中删除解构,这样我就有:
(defn table-rows [data]
(->> data
(map (fn [row]
[:tr
[:td (:name row)]
[:td (:value row)]]))
(into [:tbody])))
多亏了下面评论中的一些很棒的帮助,我才能弄清楚我需要什么,这是:
(defn table-rows [data]
(->> data
(map (fn [row]
[:tr
[:td (:name row)]
[:td (:value row)]]))
(into [:tbody])))
生产
[:tbody [:tr [:td "foo"] [:td 1]]
[:tr [:td "hey"] [:td 2]]]
谢谢你的帮助!
(对自己的注意:确保在发布这里之前找出我想从函数中得到的东西)
PS -看起来我必须等几天才能接受我自己的答案,有人建议我这样做,这样就不会显得没有答案。