18

任何人都有任何用于访问 javascript 对象的惯用 clojurescript 文档(返回为 json,本质上是一个哈希)?

我有一个通过 AJAX 请求返回的 JSON 对象:

{
  list: [1,2,3,4,5],
  blah: "vtha",
  o: { answer: 42 }
}

如何使用 clojurescript 访问这些字段?

我可以:

(.-list data)

但是当我有嵌套的值和对象时,它是如何工作的呢?

(.-answer (.-o data))

上面的内容似乎很笨拙,尤其是考虑到良好的 js 语法:data.o.answer。

使用 clojurescript 访问 json 对象的惯用方式是什么?

笔记:

我意识到我实际上可以使用 JS 语法来引用元素,这实际上非常方便。所以以下将正常工作:

(str data.o.answer)
4

5 回答 5

17

你可能想要得到:

(aget foo "list")

aget 还不是可变参数,但希望很快 它现在是可变参数。(aget data "o" "answer")会工作

于 2012-03-22T16:26:29.357 回答
11

首先,您建议的嵌套访问语法确实有效:

ClojureScript:cljs.user> (def data 
    (JSON/parse "{\"list\": \"[1,2,3,4,5]\", \"blah\": \"vtha\", \"o\": {\"answer\": \"42\"}}"))
#<[object Object]>
ClojureScript:cljs.user> (.-answer (.-o data))
"42"

您可以使用线程宏...

ClojureScript:cljs.user> (-> data (.-o) (.-answer))
"42"

..符号

ClojureScript:cljs.user> (.. data -o -answer)
"42"
于 2012-03-22T11:07:35.530 回答
6

如果您正在处理任何数量的数据,我会将 JSON 转换为 clojure 数据结构,然后使用通常的习语:

(let [my-json (js* "{
                     list: [1,2,3,4,5],
                     blah: \"vtha\",
                     o: { answer: 42 }
                   }")
      converted (js->clj my-json)]

  (get-in converted ["list" 3]) ;; => 4
  (-> converted "o" "answer") ;;=> 42
)

js*(注意:如果可以帮助,请不要使用它;它不是惯用的,并且可能会在未来的 ClojureScript 版本中消失。)

于 2012-03-22T14:39:53.683 回答
2

Clojurescript 有一个 .. 运算符,对链式 javascript 调用很有用:

(.. data -o -answer) => data.o.answer => 42
(aget (.. data -list) 1) => data.list[1] => 2

您也可以在数组上使用大多数列表运算符,例如

(into [] (.. data -list)) ; vector [1 2 3 4]
于 2013-04-26T23:53:37.383 回答
2

忘了aget,它主要是为数组(array get)设计的。利用

  • goog.object/get
  • goog.object/set

看更多

于 2018-01-29T13:34:54.093 回答