ClojureScript:获取js / window的Hashmap

时间:2016-02-26 19:46:47

标签: clojurescript

在ClojureScript中,我尝试将全局窗口对象(不是递归,只是最低级别)转换为hashmap。

通常,如果js-objects不是由Object构造的,则以下互操作有助于:

(defn jsx->clj [js-o]
  (reduce (fn [m v]
            (assoc m (keyword v) (aget js-o v)))
          {} (.keys js/Object js-o)))

但是,如果我将此应用于js / window我会收到错误:

#object[TypeError TypeError: Cannot convert a Symbol value to a string]
[...]

有没有人有过这方面的经验?

2 个答案:

答案 0 :(得分:0)

这个神秘的错误不在您的代码中,而是在repl尝试输出结果时发生。

评估要复制的repl中的$mysqli_find = mysqli_query($conn, "SELECT * FROM ap_user_points WHERE user_id NOT IN (SELECT user_id FROM ap_users group by user_id)"); while ($found_rows = mysqli_fetch_array($mysqli_find)){ $user_id = $found_rows['user_id']; echo $user_id; } ,因为这是罪魁祸首。js/cljs毫无障碍地工作,但现在如果您在repl中评估(def foo (doall (jsx->clj js/window)))或仅(pr foo),则会出现错误1}}本身。

答案 1 :(得分:0)

ClojureScript 库 dom-types 可以很好地解决此类问题。在您的 ClojureScript 中包含 lambdaisland.dom-types 之后,您可以获得各种内置类型的 print 和 pprint 处理程序。这样,您将获得 #object[HTMLElement],而不是打印 #js/Element [:div "hello"]

使用这个库后,我们可以看到 (prn js/window) 显示不同的结果。

演示: enter image description here