clojure 中如何进行简单的数据规范化?

How do simple data normalization in clojure?

我有这个地图矢量:

(def db 
 [{:id "foo" :content "foo-content" :tags []}
  {:id "bar" :content "bar-content" :tags []}
  {:id "baz etc" :content "baz-content" :tags []}])

我想将其转换为一张可通过 ID 直接访问值的地图地图,如下所示:

{:foo {:content "foo-content" :tags []}
 :bar {:content "bar-content" :tags []}
 :baz-etc {:content "baz-content" :tags []}

这是我的尝试:

(defn normalize [db]
  (into {}
    (for [item db]
      [(:id item) (dissoc item :id)])))

如何做得更好(关键转换?要考虑更多的东西?)?

有我可以使用的图书馆吗?

谢谢!

您可以使用 keyword 函数将字符串转换为关键字。

(defn normalize [db]
   (into {}
     (for [item db]
       [(keyword (:id item)) (dissoc item :id)])))

您也可以使用clojure.walk/keywordize-keys

(defn normalize [db]
  (clojure.walk/keywordize-keys
   (into {}
     (for [item db]
       [(:id item) (dissoc item :id)]))))

但是有个问题。 "baz etc" 将转换为 :baz etc。因此,在将 keyword 函数应用于 id 字符串之前,您必须将 space 替换为 -

正如@amalloy 提到的,将字符串从 file/database 转换为关键字不是一个好主意。这些应该保留为字符串。

总之,如果确实需要将字符串转为关键字,可以使用上面的方法