ClojureScript深度比较JavaScript对象

4

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

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

当我写这个问题的时候,我找到了解决方法...但我还是想问并回答它(也许可以帮助其他人)。

1个回答

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

最可靠的解决方案是使用goog.equals方法,该方法来自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

一般来说,谷歌的Closure库提供了处理纯JavaScript的强大解决方案。

这并不是真正的深度相等:(goog.object/equals #js {"a" #js [1]} #js {"a" #js [1]}) => false - CurtainDog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接