我正在学习 clojure 并尝试解决问题。我将地图存储在向量中。每个地图都包含一个 id。例如[{:id 1 :name "abc"} {:id 2 :name "xyz"}]
. 该地图还包含更多字段。
我在某处读到,不是使用向量来存储地图,而是可以使用数组映射并取消我的 id 并将其存储为{1 {:name "abc"}, 2 {:name "xyz"}}
.
我尝试浏览 clojure 文档,但没有找到一个很好的例子来实现这一点。有人可以帮助我并给我一个很好的例子吗?
您可以使用assoc
向地图添加值。assoc
需要 3 个参数。第一个参数是要添加到的映射,第二个参数是键,第三个是值。该函数返回添加了键值对的旧地图。
例子:
(assoc {} 1 {:name "abc"})
返回
{1 {:name "abc"}}
您的想法是将:id
每个记录映射的条目提升到索引中,同时将其从映射中删除。您最终会得到一个:id
-less 记录的映射,而不是完整记录的向量。
以下函数将键fk
从地图集合中取出ms
:
(defn key-by [fk ms]
(into {} (map (fn [m] [(get m fk) (dissoc m fk)]) ms)))
例如,
(key-by :id [{:id 1 :name "abc"} {:id 2 :name "xyz"}])
;{1 {:name "abc"}, 2 {:name "xyz"}}
笔记:
:id
.:id
的 s 最好是不同的,否则你会丢失记录。array-map
:这是一个实现细节。修改后的版本很可能是hash-map
.
sorted-map
.