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 转换为关键字不是一个好主意。这些应该保留为字符串。
总之,如果确实需要将字符串转为关键字,可以使用上面的方法
我有这个地图矢量:
(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 转换为关键字不是一个好主意。这些应该保留为字符串。
总之,如果确实需要将字符串转为关键字,可以使用上面的方法