(= var1 var2 var3...) は Clojure/ClojureScript のコレクションと数値でのみ機能するため、ClojureScript で 2 つの JavaScript オブジェクトを比較して完全に等しいかどうかという問題に遭遇しました。
(= (js-obj "a" 1) (js-obj "a" 1)) ;; => false
この質問を書いているときに解決策を見つけました...しかし、他の人を助けるかもしれないと尋ねて答えます。
(= var1 var2 var3...) は Clojure/ClojureScript のコレクションと数値でのみ機能するため、ClojureScript で 2 つの JavaScript オブジェクトを比較して完全に等しいかどうかという問題に遭遇しました。
(= (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
最も信頼できる解決策は、 Google の Closure Library のgoog.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 Library には、プレーンな JavaScript を処理するための堅牢なソリューションがあります。