如何确定两个jQuery对象是否相等?我希望能够在数组中搜索特定的jQuery对象.
$.inArray(jqobj, my_array);//-1
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False
Run Code Online (Sandbox Code Playgroud)
nic*_*ckf 219
从jQuery 1.6开始,你可以使用.is.以下是一年多前的答案......
var a = $('#foo');
var b = a;
if (a.is(b)) {
// the same object!
}
Run Code Online (Sandbox Code Playgroud)
如果要查看两个变量是否实际上是同一个对象,例如:
var a = $('#foo');
var b = a;
Run Code Online (Sandbox Code Playgroud)
...然后你可以检查他们的唯一ID.每次创建一个新的jQuery对象时,它都会获得一个id.
if ($.data(a) == $.data(b)) {
// the same object!
}
Run Code Online (Sandbox Code Playgroud)
虽然,通过一个简单的方法可以实现同样的目的a === b,但至少可以向下一个开发人员展示您正在测试的内容.
无论如何,这可能不是你所追求的.如果你想检查两个不同的jQuery对象是否包含相同的元素集,你可以使用它:
$.fn.equals = function(compareTo) {
if (!compareTo || this.length != compareTo.length) {
return false;
}
for (var i = 0; i < this.length; ++i) {
if (this[i] !== compareTo[i]) {
return false;
}
}
return true;
};
Run Code Online (Sandbox Code Playgroud)
var a = $('p');
var b = $('p');
if (a.equals(b)) {
// same set
}
Run Code Online (Sandbox Code Playgroud)
mau*_*ris 16
如果您还不知道,可以通过以下方式取回原始对象:
alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
Run Code Online (Sandbox Code Playgroud)
因为$("#deviceTypeRoot")还返回选择器已选择的对象数组.
小智 15
$.fn.equals(...)解决方案可能是最干净,最优雅的解决方案.
我尝试过这样快速和肮脏的东西:
JSON.stringify(a) == JSON.stringify(b)
Run Code Online (Sandbox Code Playgroud)
它可能很昂贵,但舒适的是它是隐式递归的,而优雅的解决方案却不是.
只需2美分.
小智 9
一般来说,将$(foo)与$(foo)进行比较是一个坏主意,因为它在功能上等同于以下比较:
<html>
<head>
<script language='javascript'>
function foo(bar) {
return ({ "object": bar });
}
$ = foo;
if ( $("a") == $("a") ) {
alert ("JS engine screw-up");
}
else {
alert ("Expected result");
}
</script>
</head>
</html>
Run Code Online (Sandbox Code Playgroud)
当然你永远不会指望"JS引擎搞砸".我使用"$"只是为了清楚jQuery正在做什么.
每当你调用$("#foo")时,你实际上在做一个返回一个新对象的jQuery("#foo").因此,比较它们并期望相同的对象是不正确的.
但是你能做的可能是:
<html>
<head>
<script language='javascript'>
function foo(bar) {
return ({ "object": bar });
}
$ = foo;
if ( $("a").object == $("a").object ) {
alert ("Yep! Now it works");
}
else {
alert ("This should not happen");
}
</script>
</head>
</html>
Run Code Online (Sandbox Code Playgroud)
所以你应该比较真实程序中jQuery对象的ID元素
...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
Run Code Online (Sandbox Code Playgroud)
更合适.
首先使用此函数根据键对对象进行排序
function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}
Run Code Online (Sandbox Code Playgroud)
然后,使用此函数比较对象的字符串化版本
function isEqualObject(a,b){
return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}
Run Code Online (Sandbox Code Playgroud)
这是一个例子
假设对象键的顺序不同并且具有相同的值
var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}
isEqualObject(obj1,obj2);//returns true
Run Code Online (Sandbox Code Playgroud)