tl;dr
如何从ClojureScript中的数字派生关键字:
(keyword 22)
;;=> :22 but in fact returns nil.背景
在我的ClojureScript/Hoplon应用程序中,我通过cljs-http发出HTTP请求。我收到的部分回复如下:
{:companies
{:22 {:description ... } ; A company.
:64 {:description ... }
... }
{:offers
[{:description ... } ; An offer.
{:description ... }
... ]:offers背后的向量中的每个报价都有一个:companyId,它代表:companies中的一个键。一旦收到响应,我就会reset!一个单元格 (类似于原子) query。
现在,我想迭代每一个提供,并调用一个函数offer-tpl来创建相应的HTML。为了做到这一点,offer-tpl需要报价本身以及相关公司:
(for [offer (:offers @query)]
(offer-tpl offer (get-in @query [:companies (keyword (:companyId offer))]))))))尽管这当然可以做得更优雅(建议非常感谢),但get-in不起作用。(:companyId offer)返回一个数字(例如22),但(keyword (:companyId offer))返回nil。调用(keyword (str (:companyId offer)))可以实现这个目的,但是没有其他方法可以做到这一点吗?
发布于 2016-08-28 15:47:55
(keyword "22")或(keyword (str 22))返回:22
您获得:22的原因可能是因为JSON转换的keywordize-keys选项。例如:
cljs-http默认为jsonp:http/core.cljs#L 115的keywordize键,但是在本例中您可以(而且应该)传递一个标志来禁用keywordize。
并不是JSON中的所有键都适用于Clojure关键字编撰。例如,JSON键中的空格是有效的,但在Clojure中是无效的。
请注意,数字关键字可能不正确。https://clojuredocs.org/clojure.core/keyword#example-542692cec026201cdc326d70似乎已经从现在的Clojure网站上删除了这个警告,所以也许这意味着什么,但我不确定是什么。
http://clojure.org/reference/reader目前声明:
关键字-关键字类似于符号,除了:它们可以而且必须以冒号开头,例如:fred。它们不能包含“。”或者叫什么课。与符号类似,它们可以包含一个名称空间:person/name --以两个冒号开头的关键字将在当前名称空间中解析:在用户名称空间中,::rect被读为: user /rect
那就是
符号以非数字字符开头,可以包含字母数字.
关键字的此定义不包括:22和:with spaces。
关键字函数返回无效输入的结果,但这不是背书,这只是因为检查不正确的输入将是Clojure的核心部分的性能开销。
简而言之,并不是所有的JSON键都转换成关键字,所以您应该避免使用keywordize-keys,除非您知道密钥空间和/或这样做提供了一些方便。
https://stackoverflow.com/questions/39192226
复制相似问题