如何使用Clostache遍历Map构成的Vector并显示键值
解决Clostache模板遍历带命名空间键的Map向量问题
你的问题核心是数据中的键为带命名空间的Clojure关键字(如:players/id),初始模板仅输出整个Map的字符串形式,无法提取单个字段值。以下是两种可行方案:
方案一:直接在模板中引用带命名空间的键
Clostache支持直接访问带命名空间的关键字键,只需在模板中写出完整的键名即可。修改后的模板如下:
<ul> {{#players}} <li> ID: {{players/id}}<br> 姓名: {{players/name}}<br> 分数: {{players/score}}<br> 创建时间: {{players/created_at}}<br> 更新时间: {{players/updated_at}} </li> {{/players}} </ul>
此方案无需修改数据,直接在模板中对应键名即可提取值。
方案二:预处理数据,移除键的命名空间(推荐)
如果希望模板更简洁,可在Clojure代码中先处理数据,将带命名空间的键转换为短键(如:id替代:players/id),同时可格式化日期类型的字段:
(require '[clj-time.format :as f]) ;; 移除键的命名空间 (defn remove-key-namespace [player-map] (reduce-kv (fn [acc k v] (assoc acc (keyword (name k)) v)) {} player-map)) ;; 格式化日期(可选) (def date-formatter (f/formatter "yyyy-MM-dd HH:mm:ss")) (defn format-inst-date [inst] (when inst (f/unparse date-formatter inst))) ;; 处理玩家数据 (def process-player-data (fn [raw-data] (map (fn [player] (-> player remove-key-namespace (update :created_at format-inst-date) (update :updated_at format-inst-date))) raw-data))) ;; 使用示例:将你的原始数据传入处理函数 (def processed-players (process-player-data your-raw-player-data))
处理后的数据键变为:id、:name等,模板可简化为:
<ul> {{#players}} <li> ID: {{id}}<br> 姓名: {{name}}<br> 分数: {{score}}<br> 创建时间: {{created_at}}<br> 更新时间: {{updated_at}} </li> {{/players}} </ul>
内容的提问来源于stack exchange,提问作者jwesonga
相关产品推荐
相关产品推荐

