2017-11-02 7 views
1

私は一連のURLを持っていて、URLの中には間接参照(ベクトルとして)を持っています。間接参照を持たないURLはすべてnilです。私は、HTML形式のレポートを作成するためにhiccupを使用していますので、私はこの出力をしたいClojureでマップから入れ子になったベクトルを構築する

{"URL 1" nil, 
"URL 2" ["indirect 1" "indirect 2"]} 

[:div "Imports: " 
[:ul 
    [:li "URL 1"] 
    [:li "URL 2"] 
    [:ul 
    [:li "indirect 1"] 
    [:li "indirect 2"] 
    [:li "indirect 3"]]]] 

私は戻っていくつかの問題に実行している私は、次のテストマップで出始めていますURLに間接参照がない場合はnil。私の現在のコードは次のようになります。

(defn list-imports 
    [imports] 
    (if-not (nil? imports) 
    [:div "Imports: " 
    [:ul 
     (for [direct (keys imports)] 
     [[:li direct] 
     (if-let [indirects (get imports direct)] 
      [:ul 
      (for [indirect indirects] 
       [:li indirect])] 
      [:span])])]] 
    [:div "Imports: none" [:br] [:br]])) 

問題は、それがこれを返すだ、である...

[:div 
"Imports: " 
[:ul 
    ([[:li "URL 1"] [:span]] 
    [[:li "URL 2"] [:ul ([:li "indirect 1"] [:li "indirect 2"])]])]] 

私は、間接的な輸入がnilているときのためのケースとして[:span]タグに追加する必要がありました私はそこに本当に欲しくないのですが、そうでなければnilに入れます。

もう1つの問題は、で囲まれ、余分なベクトルになります。これは、forステートメント内で複数のことを行うためです。ヒップアップで変換しようとすると、[:li "URL 1"] is not a valid element name.

答えて

1

ヒカップのタグを作るのが面倒なことになります。場合によっては、問題をより小さな部分に分割するのに役立ちます。

(defn list-indirects 
    [indirects] 
    (when (seq indirects) 
    [(into [:ul] (mapv (fn [i] [:li i]) indirects))])) 

(defn list-imports 
    [imports] 
    (if (some? imports) 
    [:div "Imports: " 
    (into [:ul] 
     (for [[url indirects] imports] 
     (into [:li url] (list-indirects indirects))))] 
    [:div "Imports: none" [:br] [:br]])) 

これらの関数は、必要な出力を与えるはずです。

(list-imports {"URL 1" nil 
       "URL 2" ["indirect 1" "indirect 2"]}) 
=> 
[:div "Imports: " 
[:ul 
    [:li "URL 1"] 
    [:li "URL 2" 
    [:ul 
    [:li "indirect 1"] 
    [:li "indirect 2"]]]]] 

この出力は、あなたの期待される出力とは若干異なりますが、あなたの例では[:li "URL 2"]タグがは有効なHTMLであることを「インダイレクト」の:ulが含まれている必要があり、すなわち、私はそれはあなたが実際にしたいと思うものに近いと思います。

これらの項目の順序が重要な場合は、となるように、特に特定の数のキーを超えると、期待通りにマップされない可能性があります。しゃっくりを作るために地図を横断すると、"URL 2"の前に来る可能性があります。"URL 1"の前です。タプルのベクトル、またはソートされたマップを使用して回避することができます。

+0

これは完璧に機能しました、ありがとうございます!私はあまりにも多くの機能を1つの機能に詰め込もうとしていたと思います。私はmapvを使っているとは思っていませんでしたが、今のところ明らかです:) –

関連する問題