ClojureScript глубоко равен для объектов JavaScript
Я столкнулся с проблемой, как сравнить два объекта JavaScript для глубокого равенства в ClojureScript, потому что (= var1 var2 var3...) работает только с коллекциями и числами Clojure/ClojureScript.
(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false
Пока я писал этот вопрос, я нашел решение... но я спрошу и отвечу на него, может быть, помогу другим.
1 ответ
Решение
Поскольку функция "=" может сравнивать коллекции ClojureScript, одним из непосредственных решений должно быть:
(= (js->clj (js-obj "a" 1)) (js->clj (js-obj "a" 1))) ;; => true
Что некрасиво и не работает на экземплярах таких объектов, как:
(= (js->clj (js/THREE.Vector3. 10 20 30)) (js->clj (js/THREE.Vector3. 10 20 30))) ;; => false
Наиболее надежным решением является использование метода goog.equals из библиотеки Google Closure.
(ns my.name-space
(:import goog.object)
(:require [cljsjs.three]))
(.equals goog.object (js/THREE.Vector3. 10 20 30) (js/THREE.Vector3. 10 20 30))) ;; => true
В целом, библиотека Google Closure Library имеет надежные решения для работы с простым JavaScript.