2017-05-31 1 views
0

問題が残っています。 問題はそうです。キーと値で関数を呼び出すことでネストされたクロージャーマップを作成する

  • 私はこのようなマップを持っています{:first {"value1" "value2" "value3"...} :second {"value1" "value2" "value3"...}....}
  • 私は パラメータ(first&value1)と戻り いくつかの情報をサーバーに要求を行う機能を持っている
  • 次のステップのような新しいマップを生成することである(それは各キーとその 値(first&value1, first&value2 ...second&value1...)との要求を行う必要があります):

    {:first 
        {:value1 
        {subvalue1, subvalue2 ..} 
        :value2 
        {subvalue2-1,subvalue2-2}}  
    :second 
        {:value3 
        {:subvalue3-1,:subvalue3-2}..}..} 
    

サブ値は各キーと値の各項目を有するリクエストを行うの結果です。 そして、ネストされたマップの4倍を達成するために、もう一度(サーバーに要求するときに3つのパラメーターで)操作を繰り返す必要があります。{first {second {third {fourth}}}}。 多分誰かが私にそれをする助けを助けてくれるかもしれません。

+0

データが示すように、 ':first'の値が一連の値である場合、' 'value2 '' 'value3' ''は意味を持ちますが、 '{" value1 "" value2 "" value3 " } 'は、マップが偶数のフォームを持たなければならないので全く意味がありません。 –

+0

実際のデータとその変換の例を追加してください。質問は、マップ(奇数の要素)の周りのエラーでいっぱいになり、あなたはリストまたはセットを望むか、それはちょうど混乱している。また、あなたが今までに試したことを追加して、私たちがそれを拾いやすいようにしてください。 – cfrick

+0

申し訳ありませんが、私は問題を説明しませんでした。最後のネストされたマップは、値{:fourth ["value1" "value2"] ....]としてベクトルまたはシーケンスを持つ必要があります。 –

答えて

2

この関数は、ビット長ったらしいですが、あなたはそれが何をする必要があるかを行います。

(defn rec-update 
    [m f] 
    (let [g (fn g [m args] 
      (into {} 
        (for [[k v] m] 
        (if (instance? java.util.Map v) 
         [k (g v (conj args (name k)))] 
         [k (into {} (map #(let [args (into args [(name k) (name %)])] 
              [(keyword %) (f args)]) 
             v))]))))] 
    (g m []))) 

fパラメータはのparamsのコレクションを取り、結果のベクトルを返す関数でなければなりません。ここでは、ランダムな応答の乱数を選びサンプルです:

(defn make-request 
    [params] 
    (vec (repeatedly (+ 1 (rand-int 3)) #(rand-nth ["r1" "r2" "r3"])))) 

以下の例が示すものではありませんが、この関数に与えられたparamsが実際にそれまでのネストされた値になります。

使用するには:

(def m {:first ["val1" "val2" "val3"], :second ["val4" "val5"]}) 

(rec-update m make-request) 
=> 
{:first {:val1 ["r2" "r2" "r3"], :val2 ["r2" "r2"], :val3 ["r1" "r3"]}, 
:second {:val4 ["r3" "r3"], :val5 ["r2" "r1"]}} 

結果にもう一度実行して:あなたが見ることができるように

(rec-update *1 make-request) 
=> 
{:first {:val1 {:r2 ["r1" "r3" "r2"], :r3 ["r3" "r2"]}, 
     :val2 {:r2 ["r1" "r1"]}, 
     :val3 {:r1 ["r2"], :r3 ["r1" "r2" "r3"]}}, 
:second {:val4 {:r3 ["r3" "r2"]}, :val5 {:r2 ["r1"], :r1 ["r2" "r3"]}}} 

を、要求から返された重複した値は、結果マップに一度表されます。

+0

ありがとう、Josh、もう1つ質問があります。私はアイデアを正しく説明していないと思う(申し訳ありません)。私の関数fはサーバにリクエストを行い、要求はhttp:// website/information/get_information?param1 = first&param2 = value1&param3 = subvalue1?param4 = subsubvalue1それは私が望む完全な要求になり、私の入れ子になった地図の「枝」)。したがって、最初のステップでは、1つのparam(最初)でリクエストを作成し、それに接続されているすべての情報を取得します。次に、2つのパラメータ(firstとvalue1)を持つrequstを作成します。 –

+0

だから、私は将来のマップ{first( "value1" "value2"):second( "value1" "value2")....の最初のレベルを持っています} –

+0

上記のコードは@AndreiBelkevichのシナリオで動作します。 'rec-update'に与える' f'関数は、あなたのマップから文字列化されたキーワードを含むベクトルになる1つの引数を必要とします。 'f'を書く必要があります。これはあなたのリクエストを行い、応答ベクトルを返します。その引数を出力し、 'rec-update'に渡すテスト関数を書いてください。あなたは私が何を意味するのか知るでしょう。 – Josh

関連する問題