2017-10-17 42 views
4

J'ai rencontré le problème de comparer deux objets JavaScript pour l'égalité profonde dans ClojureScript, car (= var1 var2 var3 ...) ne fonctionne que sur les collections et les nombres Clojure/ClojureScript. Pendant que j'écrivais cette question, j'ai trouvé la solution ... mais je vais demander et y répondre peut-être que cela aidera les autres.ClojureScript égal profond pour les objets JavaScript

Répondre

6

Depuis la "=" fonction peut comparer les collections ClojureScript, une des solutions immédiates devraient être:

(= (js->clj (js-obj "a" 1)) (js->clj (js-obj "a" 1))) ;; => true 

Ce qui est laid, et ne fonctionne pas sur des objets instanciés comme .:

(= (js->clj (js/THREE.Vector3. 10 20 30)) (js->clj (js/THREE.Vector3. 10 20 30))) ;; => false 

Le La solution la plus fiable utilise la méthode goog.equals de Google's Closure Library.

(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 

En général, la bibliothèque de fermeture de Google propose des solutions robustes pour gérer le langage JavaScript.