23

我有一些 clojurescript,我想与一些 javascript 库进行互操作。在我的 clojurescript 代码中,我进行了一些分析并得出了一个地图列表。就像是

[{:prop1 "value1" :prop2 "value2"}, {:prop1 "something else" :prop2 "etc"}...]

我需要将其传递给 javascript 函数

[{prop1: "value1", prop2: "value2}, {..} ...]

我不确定如何从我的 clojurescript 函数中返回一个 javascript 对象。有没有办法将嵌套映射和列表序列化为 javascript 对象。或者创建一个新的 javascript 对象然后在其上设置属性的方法?

4

3 回答 3

47

只是为了人们寻找类似的东西。

ClojureScript 核心现在包含一个clj->js函数。

于 2013-04-21T16:43:28.443 回答
17

我在这里找到了一个功能

(defn clj->js
  "Recursively transforms ClojureScript maps into Javascript objects,
   other ClojureScript colls into JavaScript arrays, and ClojureScript
   keywords into JavaScript strings.

   Borrowed and updated from mmcgrana."
  [x]
  (cond
    (string? x) x
    (keyword? x) (name x)
    (map? x) (.-strobj (reduce (fn [m [k v]]
               (assoc m (clj->js k) (clj->js v))) {} x))
    (coll? x) (apply array (map clj->js x))
    :else x))

正是我需要的。还有一个反函数,即js->clj在 ClojureScript 核心中。

于 2012-04-17T17:51:46.707 回答
10

这对我有用:

(defn clj->json
  [ds]
  (.stringify js/JSON (clj->js ds)))

用法:

(let [json (clj->json data-structure)]
  ;; do something with json
  )
于 2015-03-17T14:02:49.577 回答