2016-04-16 7 views
0

Dieser Code erscheint ein Objekt als eine Reihe von Schlüssel-Wert-Paare zu behandeln:Wie tiefe JavaScripts für (var a in b) zu ClojureScript?

for (var a in b) { ... 

Und ich möchte wo es zu ClojureScript

Jetzt gewöhnlich konnte ich nur tun:

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

Das Problem ist, dass b enthält eine verschachtelte Karte - und js-clj ist flach.

Das andere Problem ist, dass die Schlüssel im Objekt Ganzzahlen sind - so dass der Zugriff auf die Schlüssel durch Feldwerte nicht funktioniert. dh

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

Meine Frage ist: Wie tief Karte JavaScripts for (var a in b) zu ClojureScript?

Antwort

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. 

Wie Sie js-clj verwandelt JS-Objekte rekursiv in ClojureScript Datenstrukturen sehen.

Also, wenn Sie ein JS-Objekt:

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

js->clj wird es in folgendem ClojureScript Objekt konvertieren:

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

Soweit ich weiß, wenn Sie über JS Objekteigenschaften mit for iterieren es wird nur über Eigenschaften des Objekts, das Sie übergeben, iterieren, es geht nicht in die Eigenschaften dieser Eigenschaften:

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

Es wird nur 1 und 3 gedruckt und nicht in 2 oder 4.

würde So sei eine ClojureScript Version dieser for Schleife:

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

So bin ich nicht klar, warum Sie haben erklärt, dass js->clj flach ist, wenn es nicht ist.

Wenn Sie die gesamte Datenstruktur rekursiv durchlaufen möchten, können Sie clojure.walk/prewalk oder clojure.walk/postwolk verwenden, die alle Ihre Werte in einer Datenstruktur (sie können in Karten, Vektoren, Sets usw. einsteigen) aufrufen und Ihren Anruf tätigen Funktion für jeden gefundenen Wert:

(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}}) 
Verwandte Themen