我想知道是否有办法让ClojureScript解构与JavaScript对象一起使用,例如:
(let [{:keys [a b]} #js{:a 10, :b 20}]
(print a) ;=> I get nil, but I'd want to get 10
(print b)) ;=> I get nil, bu I'd want to get 20
谢谢
答案 0 :(得分:9)
关联解构基于get
,可以通过将它们扩展到goog.object/get
来映射到ILookup
JavaScript对象:
(extend-type object
ILookup
(-lookup
([o k]
(goog.object/get o (name k)))
([o k not-found]
(goog.object/get o (name k) not-found))))
答案 1 :(得分:1)
我还没有找到解构JS对象的直接方法。您可以将JavaScript对象转换为ClojureScript数据结构,然后进行解构:
(let [{:keys [a b]} (js->clj #js {:a 10 :b 20}
:keywordize-keys true)]
(print a)
(print b))
如果您在:keywordize-keys
中未使用js->clj
选项,则需要在解构中使用strs
而不是keys
(let [{:strs [a b]} (js->clj #js {:a 10 :b 20})]
(print a)
(print b))
答案 2 :(得分:0)
Matt Huebert的js-interop库提供JavaScript object destructuring及其版本let
。您所要做的就是在绑定表单之前添加^:js
:
(ns foo.bar
(:require [applied-science.js-interop :as j]))
(j/let [^:js {:keys [a b]} #js{:a 10, :b 20}]
[a b])
;; => [10 20]
这是递归的(有一个逃生舱口,^:clj
),并且也可以在j/fn
和j/defn
中使用。如果省略了^:js
,这些功能将像普通的Clojure。