我有这张地图矢量:
(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)])))
如何做得更好(关键转换?想到更多的东西?)?
我可以使用图书馆吗?
谢谢!
答案 0 :(得分:1)
您可以使用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
。因此,在将-
函数应用于id字符串之前,必须将空格替换为keyword
。
正如@amalloy所提到的,将字符串从文件/数据库转换为关键字并不是一个好主意。那些应该保留为字符串。
无论如何,如果你真的需要将字符串转换为关键字,你可以使用上述方法。