如何深入比较scala.js中的两个js对象?

gur*_*het 1 scala scala.js utest

既然js.Dynamic.literal() != js.Dynamic.literal(),建议的方法是测试两个文字的相等性?

我不想用特征来表征那些文字.我想知道他们是否完全平等.

我现在正在做的是以下内容

val js1 = literal()
val js2 = literal()
val json1 = JSON.stringify(js1)
val json2 = JSON.stringify(js2)
assert(json1 == json2) // true
Run Code Online (Sandbox Code Playgroud)

注意:即使在javascript {} === {}评估为false,所以我不应该首先感到惊讶.

sjr*_*jrd 6

您可以为JS类对象结构定义自己的结构相等性:

def jsStructuralEqual(a: Any, b: Any): Boolean = {
  (a, b) match {
    case (a: js.Array[_], b: js.Array[_]) =>
      a.length == b.length &&
      a.zip(b).forall((jsStructuralEqual _).tupled)

    case _ if a.constructor == js.constructorOf[js.Object] &&
        b.constructor == js.constructorOf[js.Object] =>
      val aDict = a.asInstanceOf[js.Dictionary[Any]]
      val bDict = b.asInstanceOf[js.Dictionary[Any]]
      (aDict.keySet == bDict.keySet) &&
      aDict.keySet.forall(key => jsStructuralEqual(aDict(key), bDict(key))

    case _ =>
      a == b
  }
}
Run Code Online (Sandbox Code Playgroud)

(未测试)