Javascript Clojurescript 中的传播运算符?

Javascript spread operator in Clojurescript?

我正在尝试在 clojurescript 中实现以下 javascript 代码:

const a = {
   "foo": "bar",
   //...
};

let b = {
    ...a,
  //^ what is the clojurescript equivalent for this?
    "newprop": 10,
};

我曾尝试 assoc-in,认为它的行为类似于 clojure 映射,但没有成功...

(def a {:foo "bar"})
(def b (assoc a :newProp 10))

这实际上只是将两张地图组合在一起。这可以用 merge:

来完成
(def a {"foo" "bar"})  ; Emulating the constant
(def b {"newprop" 10})

(def c (merge a b))  ; {"foo" "bar", "newprop" 10}

我的问题不够清楚,我有一个来自外部 js 库的对象 defaultProps。我的目标是创建此 js 对象的新实例并使用新道具扩展它,并将其反馈给需要 js 对象的 js 函数。这比我最初预料的要多。我终于设法通过 js->cljclj->js:

的一些杂耍来做到这一点
(def b
    (clj->js (assoc (js->clj a) "newprop" 10)))

感谢您的回答!

为您提供另一种选择,您可以使用 goog.object 与 ClojureScript 中的 JavaScript 对象进行交互。以下代码将起作用:

(require 'goog.object)

(def a #js {:foo "bar"})

;; Modify `a` inline
(goog.object/set a "newprop" 10) ;; In JS, this is equivalent to a.newprop = 10

如果您想对 a 进行浅表复制并修改该值,您可以使用 clone(其行为类似于展开运算符)。

;; Shallow copy a
(def b (goog.object/clone a))

;; Modify the cloned object
(goog.object/set b "newprop" 10)

如果您需要经常与 JavaScript 对象交互,可以使用一个简洁的库:https://github.com/binaryage/cljs-oops