Clojurescript: 将CLJS Map转换为JavaScript哈希表

11

以下代码片段不起作用

     headerElement (goog.dom/createDom
                    "div" (.strobj {"style" "background-color:#EEE"})
                    (:title note))

原因:

{ ... } 创建了一个Clojurescript映射。我需要一个JavaScript对象/哈希表。

问题:

如何进行这个简单的转换?

3个回答

13
#js读取字面量可以用于创建JavaScript对象或数组。
您可以编写:
(def test1 #js {:foo 1 :bar false})

它会创建JavaScript代码:

namespace.test1 = {"bar":false, "foo":1};

对于数组:

(def test2 #js [1 2 3 false nil true])

创造:

namespace.test2 = [1, 2, 3, false, null, true];

您还可以使用clj->js函数:

(clj->js :style "background-color:#EEE")

它的好处是可以递归地工作 - 转换嵌套的数据结构。

我写了一篇文章介绍这个(如果我可以自荐的话)


3

cljs.core/js-obj可以帮助解决这个问题。请注意,它接受普通的数组/列表(而不是映射)。

headerElement (goog.dom/createDom
               "div" (js-obj "style" "background-color:#EEE")
               (:title note))

很棒。使用 map 的相对快速的方法是:(apply js-obj (apply concat (seq map)))) - jtmoulia

1
这个宏可以让你使用带有关键字的js-obj
(defmacro obj [& key-values]
(let [obj-def (apply concat (map #(list (name (first %)) (last %))
     (partition 2 key-values)))]
    `(cljs.core/js-obj ~@obj-def)
))

Usage

(obj 
    :key someVal
    :otherKey (fn [a b] a)
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接