如何避免Clojure中嵌套的"for"函数



在我不断努力在Clojure中复制命令式编程的过程中,我似乎仍然嵌套for函数。

例如,如果我想从开始

[[{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}] [{:a 2 :b 2 :c 3} {:a 2 :b 2 :c 3}]]

并得到:

[[:table [:tr [:td {:class "a-1" "b-2" "c-3"}] [:td {:class "a-2" "b-2" "c-3"}]]

如果没有我熟悉的其他语言的经典嵌套for语句,我该如何做到这一点?

我意识到我应该把我的尝试粘贴在这里,但太糟糕了。

更新:请参阅下面的一点,我在:class值中使用了不正确的打嗝。

我的建议是查看数据的结构(您已经有了(,并尝试根据给定的数据分解问题。

你有一个类似行和单元格的结构,所以这是一种方法。格式化行,这是格式化单个单元格的结果,然后每个单元格都需要有作为哈希图传递的CSS类。

考虑到这一点:

(defn cell-classes [cell]
(->> (map (fn [[k v]] (str (name k) "-" v)) cell)
(interpose " ")
(reduce str)))
(defn format-cell [cell]
(let [classes (cell-classes cell)]
[:td {:class classes}]))
(defn format-row [cells]
(->> (map format-cell cells)
(into [:tr])))
(defn format-rows [rows]
(->> (map format-row rows)
(into [:table])))

如果我们用您的样本数据进行测试:

(clojure.pprint/pprint (format-rows [[{:a 1 :b 2 :c 3} {:a 1 :b 2 :c 3}] [{:a 2 :b 2 :c 3} {:a 2 :b 2 :c 3}]]))

它打印

[:table
[:tr [:td {:class "a-1 b-2 c-3"}] [:td {:class "a-1 b-2 c-3"}]]
[:tr [:td {:class "a-2 b-2 c-3"}] [:td {:class "a-2 b-2 c-3"}]]]

PS:在您想要的输出中有一个小问题,那就是{:class "a-1" "b-2" "c-3"}不是打嗝的理想输出,这就是为什么我在cell-classes上加入了带有空格的类名。

最新更新