2010-07-05 23 views
120

İki jQuery nesnesinin eşit olup olmadığını nasıl belirleyebilirim? Belirli bir jQuery nesnesi için bir dizi arayabilmek istiyorum. Hala bilmiyorsanızjQuery nesne eşitliği

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

cevap

186

jQuery 1.6'dan beri .is'u kullanabilirsiniz.

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

sonra ...: Aşağıda yıldan uzun süre önce gelen cevap ...

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


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

Eğer iki değişken aslında aynı nesne olup olmadığını görmek için, örneğin bir benzersiz kimliklerini kontrol edebilir. Her yeni jQuery nesnesi oluşturduğunuzda bir kimlik alır.

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

rağmen, aynı basit a === b ile elde edilebilir, yukarıdaki kudreti en azından ne için test tam olarak ne sonraki geliştirici göstermektedir.

Her durumda, muhtemelen peşinde olduğunuz şey bu değil. Eğer iki farklı jQuery nesneler elemanlarının aynı kümesi içeren olmadığını kontrol etmek istese, bu kullanabilirsiniz:

$.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; 
}; 

Source

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

Bu çözüm, yalnızca tek bir eleman olduğunda [thephpdeveloper] (http://stackoverflow.com/questions/3176962/jquery-object-equality/3176971#3176971) tarafından verilene göre basitleştiriyor . JQuery nesnelerinin eşit kabul edilebileceği bir başka duyu, aynı seçici ve bağlama sahip olup olmadıklarıdır. Bu test etmek için yeterince kolay: 'A.selector === B.selector && A.context === B.context'. Çoğu zaman içerik her zaman aynı olacaktır, bu yüzden sadece seçiciyi düşünmeliyiz. – Casebash

+2

@Casebash - true, ancak birkaç seçicinin aynı sonuç kümesine sahip olabileceğini düşünelim, örneğin: $ (': ilk') 've' $ ('*: ilk') ' – nickf

+6

[Daha küçük çözüm - '$ kullanın (a), (b) alt sının '] (http://stackoverflow.com/q/2448362/9859). – rampion

16

, sen orjinal nesneyi geri alabilirsiniz: Ayrıca seçici seçtiği nesnelerin dizisi döndürür

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

$("#deviceTypeRoot") çünkü.

+1

İki uyarı, "true" değerini gösterecektir, çünkü DOM öğesinin referansını karşılaştırıyorsunuz, '==' vs '===' size aynı sonuçları verecektir (hiçbir tür zorlama gerekmez, yalnızca iki nesne vardır referanslar) – CMS

+0

İkinci ifadeniz, True – Casebash

+0

dönen gerçek bir doğrudur. kopyalama ve yapıştırma hatası = D – mauris

8

Bu, genel anlamda edilir kötü bir fikir olduğunu şu karşılaştırması işlevsel olarak eşdeğer olduğu gibi $ (foo) ile $ (foo) karşılaştırma:

<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> 

Tabii ki asla istemez "JS motoru vida-up". JQuery'nin ne yaptığını netleştirmek için "$" kullanıyorum.

Eğer yeni bir nesne döndürür ("# foo") aslında bir jQuery yapıyoruz ("# foo") $ her aradığında

. Yani onları karşılaştırmak ve aynı nesneyi beklemek doğru değildir.

<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> 

Yani gerçekten belki

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

olduğu gibi bir şey bu yüzden gerçek programda jQuery nesnelerin kimlik unsurlarını karşılaştırmanız gerekir:

Ancak ne olabilir yapmak CAN gibi bir şey daha uygun.

+1

Açıkçası, jQuery öğesinin bir object özelliği yoktur. Elf King bunu pseudocode olarak kullanıyor görünüyor – Casebash

4

Kullanım Underscore.js IsEqual yöntemi http://underscorejs.org/#isEqual

+2

Bunun yerine lodash kullanın: https://lodash.com/docs#isEqual –

+0

@KarlGlaser - Neden olursa olsun? –

11

$.fn.equals(...) çözümü muhtemelen en temiz ve en zarif olanıdır.

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

Muhtemelen pahalı, ama rahat bir şey zarif bir çözüm değildir ederken, örtük özyinelemeli olmasıdır:

böyle hızlı ve kirli bir şey çalıştılar.

Sadece 2 sent.

+0

, iki jQuery nesnesi arasındaki eşitliği denetlemek için değil, standart nesneler için iyi değildir. "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'}" gibi. jQuery.isEqual (a, b) ... – iRaS

+10

olduğunu merak ediyorum. Bu yanlış. Nesne özelliklerinin sırası önemlidir. Yani, eğer {a: 1, b: 2} ve '{b: 2, a: 1}' varsa, 'true' döndüğünde bu 'false' değerini döndürecektir. –

+2

@EricAlberson, bu durumu ele alabilecek diğer derin karşılaştırma araçları veya komut dosyaları hakkında herhangi bir öneriniz var mı? –