如何在索引化映射中为单个条目添加索引与计数
如何在索引化映射中为单个条目添加索引与计数
嘿,我懂你现在的需求啦!你已经能用map-indexed给每个分组(就是那些不同content_type的对象)加上索引来排序和引用,但还想给每个分组里的单个条目(比如"000"、"bing"、"bong"这些)也添上专属的索引和计数,对吧?先看看你提供的示例数据和现有代码:
示例JSON数据
[ { "id" : "z1", "content_type" : "single", "item_1" : "000" }, { "id" : "z2", "content_type" : "double", "item_1" : "bing", "item_2" : "bong" }, { "id" : "z3", "content_type" : "triple", "item_1" : "tttt", "item_2" : "toooo", "item_3": "tiii" }, { "id" : "z4", "content_type" : "double", "item_1" : "111", "item_2" : "222" }]
现有组件代码
[:div.scroller (doall (map-indexed (fn [index coll] (condp = (:content_type coll) "single" ^{:key (str index)}[:div (str (:item_1 coll))] "double" ^{:key (str index)}[:div [:div (str (:item_1 coll))][:div (str (:item_2 coll))] [:div (str index)]] )) collections))]
解决方案
要实现给单个条目加索引和计数,我们可以先把每个分组里的item_*字段提取出来并排序,再用map-indexed给每个条目添上索引。这里给你修改后的代码:
[:div.scroller (doall (map-indexed (fn [group-index coll] ;; 提取所有以item_开头的字段,按键名排序后只保留值,保证item_1、item_2的顺序 (let [items (->> coll (filter (fn [[k _]] (clojure.string/starts-with? (name k) "item_"))) (sort-by key) (map val))] (condp = (:content_type coll) "single" ^{:key (str group-index)} [:div ;; 给每个单个条目加上索引 (map-indexed (fn [item-index item] [:div (str "[" item-index " " item "]")]) items)] "double" ^{:key (str group-index)} [:div ;; 给每个条目加索引 (map-indexed (fn [item-index item] [:div (str "[" item-index " " item "]")]) items) ;; 原有的分组索引保留 [:div (str "Group index: " group-index)] ;; 还可以加条目计数 [:div (str "Total items in group: " (count items))]]))) collections))]
代码说明:
- 提取并排序条目:用
filter筛选出所有键名以item_开头的字段,再用sort-by key保证item_1、item_2的顺序,最后用map val拿到纯粹的条目内容列表。 - 单个条目加索引:对每个条目列表再次使用
map-indexed,就能给每个条目生成专属的索引,输出你想要的[0 "000"]、[1 "bing"]格式。 - 扩展计数功能:如果需要显示每个分组的条目总数,直接用
(count items)就能获取,比如示例里的Total items in group。
这样既保留了原有的分组索引,又给每个单个条目添上了独立的索引和计数,完全符合你的需求哦!
备注:内容来源于stack exchange,提问作者txesc
相关产品推荐
相关产品推荐

