2017-10-17 117 views
4

我遇到了问题,因为(= var1 var2 var3 ...)只适用于Clojure/ClojureScript集合和数字,所以如何比较两个JavaScript对象在ClojureScript中的深度平等。ClojureScript深入等于JavaScript对象

(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false 

虽然我写了这个问题,我找到了解决办法......但是我会问和回答这个问题也许它会帮助别人。

回答

6

既然“=”功能可以比较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 

上实例化对象不起作用最可靠的解决方案是使用Google's Closure Librarygoog.equals方法。

(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库具有强大的解决方案来处理普通的JavaScript。