2016-04-01 6 views
0

私はマップのこのベクトルを持っている: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)]))) 

よくする方法(キーコンバージョンはもっと考えていますか?)?

私は使用できるライブラリはありますか?

ありがとうございます!

+5

あなたが持っているものは良いと思います。その一般的な名前が「正規化」されているにもかかわらず、その関数は特定のデータ変換を行います。 – glts

+1

datascriptは、あなたが簡単にアクセスできるように、任意の属性のための索引を作成します(これはあなたがやっていることです)。 – ClojureMostly

答えて

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に変換されます。したがって、keyword関数をid文字列に適用する前に、スペースを-に置き換える必要があります。

@amalloyが述べたように、ファイル/データベースの文字列をキーワードに変換するのは良い考えではありません。それらは文字列として残す必要があります。

とにかく文字列をキーワードに変換する必要がある場合は、上記の方法を使用できます。

+4

私は、これらのことのどちらかをすることを強くお勧めします。あなたの入力がファイルやデータベースなどからの文字列であれば、絶対に文字列として残す必要があります。キーワードはソースコードに入力したもので、コンパイル時にはほとんどが知っているものです。 – amalloy

+0

@amalloyありがとう!知って良いこと... – leontalbot

関連する問題