JavaScript 个对象的 ClojureScript 深度相等
ClojureScript deep equal for JavaScript objects
我已经 运行 解决了如何在 ClojureScript 中比较两个 JavaScript 对象以获得深度相等的问题,因为 (= var1 var2 var3...) 仅适用于 Clojure/ClojureScript集合和数字。
(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false
虽然我写了这个问题,但我找到了解决方案...但我会提出并回答它可能会帮助其他人。
由于“=”函数可以比较 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 method from 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
总的来说,Google 的 Closure Library 有处理普通 JavaScript 的强大解决方案。
我已经 运行 解决了如何在 ClojureScript 中比较两个 JavaScript 对象以获得深度相等的问题,因为 (= var1 var2 var3...) 仅适用于 Clojure/ClojureScript集合和数字。
(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false
虽然我写了这个问题,但我找到了解决方案...但我会提出并回答它可能会帮助其他人。
由于“=”函数可以比较 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 method from 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
总的来说,Google 的 Closure Library 有处理普通 JavaScript 的强大解决方案。