2017-04-10 40 views
0

我是一个新的Clojurescript,并且想要使用clojurescript和电子基于一个小json文件破解arround。使用Clojurescript访问Json数据中的数组我使用Clojurescript访问数组中的数据

我做这样的事情(过境/ cljs)

(def jsondata (t/read (t/reader :json) (.readFileSync fs path_to_file "utf8"))))) 

首先我检查,如果状态正常,工作正常...

(let [json_status (get jsondata "status")] 
     (.log js/console "JSON Glossar Status:" json_status)) 
现在

,我怎么能访问一个页面数组中的地图,还是一步一步通过地图?

{"status":"ok", 
    "pages":[ 
     { 
      "id":1, 
      "name":"name1", 
      "image":"imagename1.png", 
      "children":[ 
       { 
        "id":1, 
        "copytext":"kdjsldjsljfl" 
       }, 
       { 
        "id":2, 
        "copytext":"dksdöfksöfklsöf" 
       } 
      ] 
     }, 
     { 
      "id":2, 
      "name":"name1", 
      "image":"imagename1.png", 
      "children":[ 
       { 
        "id":4, 
        "copytext":"kdjsldjsljfl" 
       }, 
       { 
        "id":5, 
        "copytext":"dksdöfksöfklsöf" 
       } 
      ] 
     } 
    ] 
    } 

回答

1

对于嵌套的ClojureScript/JavaScript interop,您可以使用aget(即“array get”)。

例如,如果你想访问你的“页”阵列的第二个地图项目,你可以这样做:

(def my-js-object 
    (clj->js {:status "ok" 
      :pages [{:id 1 
        :name "foo" 
        :children []} 
        {:id 2 
        :name "bar" 
        :children []}]})) 

(aget my-js-object "pages" 1) 

在我简单地使用clj->js构建名义上面的代码(和不完整的)表示你的JSON;我希望这足以说明问题。

我REPL输出是:

#js {:id 2, :name "bar", :children #js []} 

如果你想做一些与每个页面的项目,如更复杂“地图上每页HashMap和拔出名值”,那么你可以利用.- JS属性访问的

(->> (.-pages my-js-object) 
    (map #(.-name %))) 

REPL输出:

("foo" "bar") 
+0

好的,我的键是字符串类型,我可以使用JS属性访问器? – bluelemonade

+0

是的,预计钥匙将是字符串。你不应该有任何问题。即使我在我的示例中使用了字符串键,REPL也会如上所示输出结果(使用JS数据结构的关键字表示形式)。 – Scott

+0

在REPL中尝试一下;您可以在CLJS中同时使用关键字和字符串,这些关键字和字符串将转换为JS,但您将使用字符串通过aget访问属性。 – Scott