2016-03-25 20 views
1

サブマップ内のすべてのデータのリストを生成し、次のように:はClojureの:私は、データ構造を持っている

(def data {:node {:subnode 'a}, :node2 {:subnode2 'b, :subnode3 'c} }) 

は私がサブノード(ヴァルスすなわち、トップノード(キー)の値のリストを作成したいです)、次のようになります。

(:subnode 'a, :subnode2 'b, :subnode3 'c) 

どうすればいいですか?私がこれまで試したほとんどすべてを生成します。

すべての値が分離されている
({:subnode 'a} {:subnode2 'b, :subnode3 'c}) 

+0

不明確なものをあなたは尋ねています。 「トップノード(キー)、すなわちサブノード(値)のリストを生成したいのですが、それはどちらですか? '(mapcat val ...)'を実行すると、2番目のデータ構造が生成されます。 –

+0

(flatten(mapcat val data))は、私が欲しいものをくれた、ありがとう。基本的に私はネストされたマップ構造を持っています - ネストされたすべてのキーと値のペア(:サブノードaなど)を自分のリストに入れたいです。新しいリストには上位ノード(:node、:node2)は含まれず、その値(サブノード)が含まれます。私が問題を抱えていたのは、個々の要素({:subnode 'a}が1つの要素であり、{:subnode2' b、:subnode3 'c}は次の要素であるため、 (:subnode 'a、:subnode2' b、:subnode3 'c)。 – Touchdown

+0

@PiotrekBzdylの答えが好きなら、それを受け入れてください!:) – jmargolisvt

答えて

2

あなただけflatten、それをトップレベルのマップの各値を抽出し、することができます

また

(flatten (mapcat second data))

flattenによって行わ深い肥育を避けるために(レオン・Grapenthinで述べたように)あなたが提供するソリューションを使用することができますjmargolisvtによってまたはconcatを使用します。

(apply concat (mapcat second data))

+0

それは私に前と同じ結果を与えるようです: – Touchdown

+0

申し訳ありませんが、私は質問を誤解しています。私は自分の答えを決めました。 –

+0

ありがとうございました。(flatten(mapcat val data))と同様に動作します。 mapcatは私が行方不明だったものです! – Touchdown

2

あなたapply場合10あなたのmapに、あなたはそれらをすべて1つのマップで得られます。

user=> data 
{:node {:subnode a}, :node2 {:subnode2 b, :subnode3 c}} 
user=> (apply conj (map val data)) 
{:subnode a, :subnode2 b, :subnode3 c} 
0

ライブラリ関数valsは、すべてのマップのヴァルスを収集し、merge、マップをマージするために、あります

user> data 
{:node {:subnode a}, :node2 {:subnode2 b, :subnode3 c}} 
user> (apply merge (vals data)) 
{:subnode a, :subnode2 b, :subnode3 c} 
関連する問題