你能在ClojureScript中构建一个JavaScript对象吗?

时间:2018-04-09 05:17:24

标签: clojurescript

我想知道是否有办法让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

谢谢

3 个答案:

答案 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/fnj/defn中使用。如果省略了^:js,这些功能将像普通的Clojure。