Clojurescript中的Javascript传播运算符?



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

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

我试图assoc-in,以为它会表现得像一张破门地图,但没有成功......

为了给你提供另一个选项,你可以使用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(其行为类似于 spread 运算符(。

;; 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

我的问题不够清楚,我有一个来自外部 js 库的对象defaultProps。我的目标是创建这个 js 对象的新实例,并使用新的 props 对其进行扩展,并将其反馈回期望 js 对象的 js 函数。事情比我最初预见的要多。我终于设法通过一些杂耍来js->cljclj->js

(def b
(clj->js (assoc (js->clj a) "newprop" 10)))

感谢您的回答!

(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}

最新更新