Javascript оператор распространения в Clojurescript? - PullRequest
0 голосов
/ 05 января 2020

Я пытаюсь получить следующий код javascript в clojurescript:

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

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

Я пытался assoc-in, думая, что он будет вести себя как карта замыкания, но безуспешно ...

Ответы [ 4 ]

1 голос
/ 17 января 2020

Чтобы предоставить вам еще одну опцию, вы можете использовать goog.object для взаимодействия с JavaScript объектами в ClojureScript. Будет работать следующий код:

(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

0 голосов
/ 05 января 2020

Это просто объединение двух карт. Это можно сделать с помощью merge:

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

(def c (merge a b))  ; {"foo" "bar", "newprop" 10}
0 голосов
/ 05 января 2020

Мой вопрос был недостаточно ясен, у меня был объект defaultProps, поступающий из внешней библиотеки js. Моя цель состояла в том, чтобы создать новый экземпляр этого объекта js, расширить его новыми реквизитами и передать обратно функции js, ожидающей объект js. Это было нечто большее, чем я предвидел. Наконец-то мне удалось это сделать с помощью некоторых манипуляций с js->clj и clj->js:

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

Спасибо за ваши ответы!

0 голосов
/ 05 января 2020
(def a {:foo "bar"})
(def b (assoc a :newProp 10))
...