2016-05-06 11 views
2

ツリー構造全体がすぐに見えるようにネストされたハッシュマップをきれいに印刷する便利な方法がClojureScriptにありますか?Pretty-print ClojureScriptのネストされたハッシュマップ

例えばこの

(def my-map {:a {:b 1 :c 9} :b {:d 8 :e {:f 2 :g 3 :h 4}} :c 10}) 

のようなマップは次のように印刷する必要があります。

{:a {:b 1 
    :c 9} 
:b {:d 8 
    :e {:f 2 
     :g 3 
     :h 4}} 
:c 10} 

EDIT:もマップ内のベクトルがあるかもしれません。ユースケースは、開発中に大きなデータ構造を検査することです。

答えて

1

組み込みの方法はありません。 cljs.pprintを使用し、cljs.pprint/*print-right-margin*を低い値に設定することで、あなたが望むものに近づくかもしれません。

私は非常に便利なinspect機能を提供して小さなライブラリshodanを見てみることをお勧めします:

(require '[shodan.inspection :refer [inspect]]) 

(inspect {:aaaaaa 1 
      :bbbbbb {:ccc 2 
        :dddddd [1 2 3 4 5]}}) 

それはあなたのCLJSのREPLには何も印刷されませんが、ブラウザの中に便利なビューを提供しますコンソール:あなたが崩壊し、ネストされたデータ構造を拡張することができ

enter image description here

- それは基本的にあなたが尋ねません。私は次のコードを書いた個人的な挑戦として

+0

出力が10を超えると、かなり醜いです: '(def my-map {:a {:b 1:c 9}:b {:d 8:e { f 2:g 3:h 4}}:c "sssssssssssssssssss"}) ' – leetwinski

+1

はい、そうです。最近、私はそのような場合に良い仕事をする小さな図書館を発見しました。私は答えにそれに関する情報を追加しました。 –

0

(enable-console-print!) 
(def atomic? (complement coll?)) 
(def padding #(apply str (repeat % " "))) 
(def tabulate #(apply str (repeat % "\t"))) 
(def strcat #(->> (apply concat %&) (apply str))) 
(defn my-max-key [x] (if (empty? x) [""] (apply (partial max-key count) x))) 
(defn longest-key [m] (->> m keys (filter atomic?) (map str) my-max-key)) 
(def length (comp count str)) 
(def not-map? (complement map?)) 
(def nested? #(some coll? %)) 
(def join #(apply str (interpose % %2))) 
(def join-lines (partial join "\n")) 
(defn has-atomic? [coll] (some atomic? coll)) 
(defn diff-key-lengths [key1 key2] (- (length key1) (length key2))) 
(defn convert 
    ([thing] (convert -1 thing)) 
    ([depth thing] 
    (defn convert-items [] 
    (defn convert-seq [] 
     (conj [] 
      (map (partial convert (inc depth)) thing) 
      "")) 
    (defn string-horizontally [[key value]] 
     (str (tabulate (inc depth)) 
      key 
      (padding (diff-key-lengths (longest-key thing) key)) 
      " → " 
      value)) 
    (defn string-vertically [[key value]] 
     (str (convert (inc depth) key) "\n" 
      (convert (+ 2 depth) "↓") "\n" 
      (convert (inc depth) value) "\n")) 
    (defn convert-kv [[key value]] 
     (if (nested? [key value]) 
      (string-vertically [key value]) 
      (string-horizontally [key value]))) 
    (cond (atomic? thing) 
      [(str (tabulate depth) thing)] 

      (not-map? thing) 
      (convert-seq) 

      (map? thing) 
      (map convert-kv thing))) 
    (->> (convert-items) flatten join-lines))) 

(def sample-input [["the first thing in this nested vector"] 
        {{"this is a key in a nested map" 
        "that points to me!!!"} 
        {"and that entire map points to this map!!!" 
        "cool!!!" 
        "but it gets cooler cause..." 
        "the value's line up!!!"}}]) 
(->> sample-input convert println) 

の端子出力は(PSSTですが...マップ内の値が並ぶんが、私はクロムは等幅フォントを使用していることはないと思います!():

関連する問題