0

我正在尝试将 clojurescript 映射传递给网络工作者。在我通过之前,它的类型是PersistentArrayMap.

cljs.core.PersistentArrayMap {meta: null, cnt: 3, arr: Array(6), __hash: null, cljs$lang$protocol_mask$partition0$: 16647951…}

但是,当它到达工人时,它只是一个普通的旧对象

Object {meta: null, cnt: 3, arr: Array(6), __hash: null, cljs$lang$protocol_mask$partition0$: 16647951…}

数据看似完好无损。在这一点上,我想把它变回 aPersistentArrayMap以便我可以再次在 cljs 中使用它。

使用clj->jsandjs->clj并没有真正起作用,因为它不区分关键字和字符串,所以会丢失一些数据。

处理这种情况的最佳方法是什么?我可能会以完全错误的方式处理这个问题。

4

2 回答 2

2

内置的解决方案是将数据序列化到 EDN 并读回。clj->js本质上是有损的,应该避免。

您首先将对象转换为字符串并将其发送给工作人员。

(pr-str {:a 1})
;; => "{:a 1}"

在工作人员中,您通过cljs.reader/read-string

(cljs.reader/read-string "{:a 1}")
;; => {:a 1}

这通常足够好,但transit-cljs库会稍微快一些。根据您计划发送的数据量,可能值得额外依赖。

于 2018-08-02T20:54:06.210 回答
1

keywordize-keys在代码中使用了吗?

(def json "{\"foo\": 1, \"bar\": 2, \"baz\": [1,2,3]}")
(def a (.parse js/JSON json))
;;=> #js {:foo 1, :bar 2, :baz #js [1 2 3]}

(js->clj a)
;;=> {"foo" 1, "bar" 2, "baz" [1 2 3]}

(js->clj a :keywordize-keys true)
;;=> {:foo 1, :bar 2, :baz [1 2 3]}

完整的文档在这里

于 2018-07-30T01:28:39.173 回答