如何深入比较scala.js中的两个js like对象?
How to deeply compare two js like objects in scala.js?
自 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
注意:即使在 javascript {} === {}
中计算结果为 false,所以我一开始就不应该感到惊讶。
您可以为类 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
}
}
(未测试)
自 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
注意:即使在 javascript {} === {}
中计算结果为 false,所以我一开始就不应该感到惊讶。
您可以为类 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
}
}
(未测试)