2016-04-16 8 views
0

このコードは、キーと値のペアの集合としてオブジェクトを処理するために表示されます。(var a in b)のJavaScriptをClojureScriptに深くマップする方法は?

for (var a in b) { ... 

そして、私はClojureScript

にマッピングしたい今、通常、私はちょうど行うことができます:

(doseq [[k v] (js->clj js/b)] 

問題はbにネストマップがあり、js-cljが浅いことです。

もう1つの問題は、オブジェクト内のキーが整数なので、フィールド値でキーにアクセスすることはできません。すなわち

{0 #object... 1 #object ... } 

私の質問は:ClojureScriptへどのように深いマップJavaScriptのfor (var a in b)

答えて

0
(doc js->clj) 

------------------------- 
cljs.core/js->clj 
([x] [x & opts]) 
    Recursively transforms JavaScript arrays into ClojureScript 
    vectors, and JavaScript objects into ClojureScript maps. With 
    option ':keywordize-keys true' will convert object fields from 
    strings to keywords. 

あなたがjs-cljを見ることができるようにはJSはClojureScriptのデータ構造に再帰的にをオブジェクトに変換します。

だから、JSのオブジェクトがある場合:

{1: {2: "a"}, 3: [true, 4]} 

js->cljは以下のClojureScriptのオブジェクトに変換します:限りあなたがforとJSオブジェクトのプロパティを反復処理するとき、私が知っているよう

{"1" {"2" "a"}, "3" [true 4]} 

をそれあなたが渡しているオブジェクトのプロパティだけを繰り返しますが、それはそれらのプロパティのプロパティになることはありません:

for (a in {1: {2: "a"}, 3: {4: "b"}) { console.log(a); }; 

13のみを出力し、2または4にはなりません。

だからforループのClojureScriptのバージョンは次のようになります。

(doseq [[k v] (js->clj js/g)] 
    (.log js/console k)) 

あなたはそれがないときjs->cljが浅いことを述べている理由だから私は明確ではないです。

またはclojure.walk/postwolkを使用してデータ構造全体を再帰的に歩きたい場合は、データ構造内のすべての値を参照します(地図、ベクター、セットなどの情報を知っています)。遭遇する各値の関数:

(clojure.walk/postwalk 
    #(do (.log js/console "PostWalking" %) 
     %) 
    {:a 1 :b {:c 2}}) 

(clojure.walk/prewalk 
    #(do (.log js/console "PreWalking" %) 
     %) 
    {:a 1 :b {:c 2}}) 
関連する問題