JQuery 对象相等性

如何确定两个 jQuery 对象是否相等?我希望能够搜索一个特定 jQuery 对象的数组。

$.inArray(jqobj, my_array);//-1
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False
165376 次浏览

如果你仍然不知道,你可以通过以下方法得到原始物体:

alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True

因为 $("#deviceTypeRoot")还返回选择器选择的对象数组。

一般来说,将 $(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>

当然,你永远不会想到“ 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>

因此,实际上您可能应该比较实际程序中 jQuery 对象的 ID 元素

...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")

更合适。

从 jQuery 1.6开始,您就可以使用 .is了。

var a = $('#foo');
var b = a;




if (a.is(b)) {
// the same object!
}

如果你想知道两个变量是否实际上是同一个对象,例如:

var a = $('#foo');
var b = a;

... 然后你就可以检查他们的唯一 ID。每次你创建一个新的 jQuery 对象,它都会得到一个 id。

if ($.data(a) == $.data(b)) {
// the same object!
}

虽然,使用一个简单的 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;
};

来源

var a = $('p');
var b = $('p');
if (a.equals(b)) {
// same set
}

使用 Underscore.js isequals 方法 http://underscorejs.org/#isEqual

$.fn.equals(...)解决方案可能是最干净和最优雅的一个。

我尝试过一些快速而肮脏的方法,像这样:

JSON.stringify(a) == JSON.stringify(b)

它可能代价高昂,但令人满意的是它是隐式递归的,而优雅的解决方案则不是。

只有我的两分钱。

如果要检查内容是否相等,只需使用 Stringify (obj)

例如 Var a = { key: val } ;

Var b = { key: val } ;

Stringify (a) = = JSON.stringify (b) ——-> 如果内容相同,则返回 true。

使用此函数根据键首先对对象进行排序

function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}

然后,使用这个函数比较对象的字符串版本

function isEqualObject(a,b){
return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}

这里有一个例子

假设对象键的顺序不同,并且具有相同的值

var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}


isEqualObject(obj1,obj2);//returns true