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.

Другие вопросы по тегам