在我不断努力在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
上加入了带有空格的类名。