在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]
[...]
有没有人有过这方面的经验?
答案 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)
显示不同的结果。