如果我尝试这样的事情:
$(".foo") === $(".foo") // = false
......我弄错了。如果我改为尝试此查询,
$(".foo").get(0) === $(".foo").get(0) // = true
......我明白了。
那是因为:
{a:myObject} !== {a:myObject};
[myObject] !== [myObject];
myObject === myObject;
我想知道是否有任何简洁的方法来测试这种相等性,最好是内置于jQuery中。我写的第二种方法只有在最多一个匹配.foo
的元素时才能正常工作。该解决方案适用于任何数量的元素。
显然,我不想只检查".foo" === ".foo"
,因为我使用的实际选择更复杂。我只是为这个例子简化了它们。 (例如,我可能想检查$(this)
是否选择与$(".foo")
相同的内容。)
答案 0 :(得分:13)
我认为您正在寻找$().is
。 Docs here
var foo, bar;
foo = $('foo');
bar = $('.bar');
// This will check to see foo and bar contain the same elements
foo.is(bar); // true | false
修改:@lolwut为此答案提供了jsfiddle。阅读完评论后,我对其进行了更新,并确定此答案对OP的案例不可靠。
答案 1 :(得分:7)
核心库中没有任何内容可以检查jQuery对象的序列相等性,但是下面应该可以解决这个问题:
$.fn.sequenceEqual = function(compareTo) {
if (!compareTo || !compareTo.length || this.length !== compareTo.length) {
return false;
}
for (var i = 0, length = this.length; i < length; i++) {
if (this[i] !== compareTo[i]) {
return false;
}
}
return true;
}
哪个可以这样使用:
$(".foo").sequenceEqual($(".bar"))
为了完整性,可以像这样编写内容相等的方法:
$.fn.contentsEqual = function(compareTo) {
return compareTo && this.length === compareTo.length && this.length === this.filter(compareTo).length;
}
哪个可以这样使用:
$(".foo").contentsEqual($(".bar"))
答案 2 :(得分:4)
如果要检查两个集合是否包含完全相同的元素(可能以不同的顺序),那么Array#every
与$.fn.index
组合可以完成这项工作:
var $this = $("p"),
$other = $("p");
// same length and $other contains each element of $this
var equal = $this.length === $other.length
&& Array.prototype.every.call($this, function(elem) {
return $other.index(elem) > -1;
});
答案 3 :(得分:3)
作为pimvdb答案的替代方案(非常好,我只提供完整性),您可以利用add()不会添加jQuery对象中已存在的元素的事实。因此,您可以写:
$.fn.containsSameElements = function(other) {
var len = this.length;
return other.length == len && this.add(other).length == len;
};
答案 4 :(得分:-1)
好的,只使用jquery内置,这似乎是正确的
$(oneSelector).filter($(anotherSelector)).length == 1
if($(oneSelector).is($(anotherSelector)))...它们是相等的