1

我的实际行为是

(js->clj (clj->js [:a :b :c]) :keywordize-keys true)
=> ["a" "b" "c"]

期望的行为

[:a :b :c]
4

1 回答 1

2

我不使用 ClojureScript,但应该注意的:keywordize-keys是,它不会做任何事情,因为向量是由索引键控的。向量的元素是值,而不是索引。

你可以做类似的事情

(->> [:a :b :c]
     (clj->js)
     (js->clj)
     (mapv keyword))

; Should print [:a :b :c]

当然,如果结构是嵌套的,这会变得有点复杂,但这是相同的一般想法。


由于 JSON 不识别“关键字”的概念,因此没有简单的方法可以在两种格式之间进行转换并维护什么是字符串和什么是关键字。如果你真的需要区分,你可以使用 Clojure 的 EDN 格式而不是 JSON。这只有在您没有进行过多的 JavaScript 互操作时才有效。与普通 JS 库交换的任何数据都将涉及关键字和字符串的合并,除非该库理解 EDN 格式,或者您做了一些不幸的事情,例如将某种元数据附加到对象上,指示什么是关键字,什么不是关键字。

您也可以完全取消关键字的想法,并在内部使用字符串来处理所有内容。那会很糟糕,但至少它会使互操作更容易。

于 2018-11-29T03:11:35.200 回答