7

以下に示すように、clojureマップを文字列、ほぼキーと値のペアに変換するにはどうすればよいですか:

Clojure データ:

(def data { :starks "Winter is coming" :Lannisters "Hear me roar" })

上記を変換したい

"starks" "winter is coming" "Lannisters" "hear me roar"

間に識​​別子/区切り文字は必要ありませんが、"starks"常に続く必要があることは明らかです"winter is coming"

私はこれを試しました:

(str (keys data) (vals data))

これは次のように出力されます:

"(:starks :Lannisters)(\"Winter is coming\" \"Hear me roar\")"

それは私がまったく望んでいないものです...

  • マップ データのキーと値は常に同じとは限らないため、汎用的である必要があります
  • 値にはネストされたマップが含まれないなどのように、常に1つのレベルしかありません..

編集

私が実際にやろうとしていること:

Clojure を使用して、数千のNeo4jノードのインデックスを作成しようとしています。このタスクを支援するために、私はNeocons Clojure neo4jライブラリを使用しています。

ドキュメントによると、は次のadd-to-indexようなプロパティと値を受け入れます。

(nn/add-to-index (:id node) (:name idx) "username" "joe")))

上記の場合、これは次のようになります

(nn/add-to-index (:id node) (:name idx) "starks" "winter is coming" "Lannisters" "Hear me roar")))

これでノードができました。ノードのプロパティにアクセスでき、(:data node)それによって clojure マップが得られます。

プロパティはノードごとにかなり異なるため、ライブラリが理解できる方法でそのマップをライブラリに渡す方法を見つけようとしています..

Marius Danilaの答えは、私をほぼそこに導きました。

やっている

(map name (apply concat data))

結果の周りに中かっこがあるため、3番目のパラメーターについてはまだ不平を言っています。

では、どうすればこれを達成できますか?自分でプロパティを構築するには、大量のif-notブロックを作成する必要がありますか?

ありがとう

4

4 に答える 4

8

これでうまくいくはずです:

(map name (apply concat data))

マップはキーと値のペアのシーケンスとして表示でき、2 つの要素の配列として表されます。ペアを連結し、キーワードと文字列から名前を抽出します (文字列の場合、これは何もしません。キーワードの場合は、':' なしでビットを返します)。

投稿したコードから、次のように使用すると思います。

(apply nn/add-to-index (list* (:id node) (:name idx) (map name (apply concat data))))
于 2013-04-15T15:03:15.793 に答える
2

次のことを試すことができます。

=> (interleave (map name (keys data)) (vals data))

;; which returns ("starks" "Winter is coming" "Lannisters" "Hear me roar")
于 2013-04-16T06:08:33.570 に答える