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

时间:2016-04-01 20:50:56

标签: clojure clojurescript

我有这张地图矢量:

(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)])))

如何做得更好(关键转换?想到更多的东西?)?

我可以使用图书馆吗?

谢谢!

1 个答案:

答案 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所提到的,将字符串从文件/数据库转换为关键字并不是一个好主意。那些应该保留为字符串。

无论如何,如果你真的需要将字符串转换为关键字,你可以使用上述方法。