如何确定两个 jQuery 对象是否相等?我希望能够搜索一个特定 jQuery 对象的数组。
$.inArray(jqobj, my_array);//-1 alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False
如果你仍然不知道,你可以通过以下方法得到原始物体:
alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
因为 $("#deviceTypeRoot")还返回选择器选择的对象数组。
$("#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了。
.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也可以实现同样的目标,但是上面的内容至少可以向下一个开发人员展示您正在测试的内容。
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(...)解决方案可能是最干净和最优雅的一个。
$.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