Clojure中的数组映射示例

Array-map example in clojure

我正在学习Clojure,并尝试解决问题。我将地图存储在矢量中。每个地图都包含一个ID。例如[{:id 1 :name"abc"} {:id 2 :name"xyz"}]。该地图还包含更多字段。

我在某处读到,而不是使用向量存储映射,我可以使用数组映射并删除ID并将其存储为{1 {:name"abc"}, 2 {:name"xyz"}}之类的东西。

我尝试浏览了clojure文档,但是没有找到一个很好的例子来实现这一目标。可以请一些帮助我,给我一个很好的例子吗?


您的想法是将每个记录映射的:id条目提升到索引中,同时将其从映射中删除。您最终得到的是少于:id条记录的映射,而不是完整记录的向量。

以下功能将键fk从地图ms的集合中移出:

1
2
(defn key-by [fk ms]
  (into {} (map (fn [m] [(get m fk) (dissoc m fk)]) ms)))

例如,

1
2
(key-by :id [{:id 1 :name"abc"} {:id 2 :name"xyz"}])
;{1 {:name"abc"}, 2 {:name"xyz"}}

注意:

  • 每个记录都应有一个:id
  • 最好将您的:id与众不同,否则您将丢失记录。
  • 不要依赖array-map:这是一个实现细节。修改后的版本可能是hash-map
    • 如果需要按键对地图进行排序,请使用sorted-map
    • 如果您需要按插入顺序保留记录,请再考虑一下。


您可以使用assoc向地图添加值。 assoc需要3个参数。第一个参数是要添加到的地图,第二个参数是键,第三个参数是值。该函数返回添加了键值对的旧映射。

示例:

1
(assoc {} 1 {:name"abc"})

返回

1
{1 {:name"abc"}}