2010-07-05 4 views
120

Wie kann ich feststellen, ob zwei jQuery-Objekte gleich sind? Ich würde gerne in der Lage sein, ein Array nach einem bestimmten jQuery-Objekt zu durchsuchen.jQuery Objektgleichheit

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

weil $("#deviceTypeRoot") auch eine Reihe von Objekten zurückgibt, die der Wähler gewählt hat:

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

Antwort

186

Seit jQuery 1.6 können Sie .is verwenden. Im Folgenden finden Sie die Antwort von vor über einem Jahr ...

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


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

Wenn Sie tatsächlich das gleiche Objekt, wenn zwei Variablen sehen wollen, sind zB:

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

... Sie dann kann ihre eindeutigen IDs überprüfen. Jedes Mal, wenn Sie ein neues jQuery-Objekt erstellen, erhält es eine ID.

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

Obwohl, das gleiche mit einer einfachen a === b, die über Macht zumindest zeigt die nächsten Entwickler genau erreicht werden könnte, was Sie testen für.

In jedem Fall ist das wahrscheinlich nicht das, wonach Sie suchen. Wenn Sie, wenn zwei verschiedene jQuery Objekte den gleichen Satz von Elementen, die Sie könnten so enthalten überprüfen wollte:

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

Diese Lösung vereinfacht sich zu der von [thepphdeveloper] (http://stackoverflow.com/questions/3176962/jquery-object-equality/3176971#3176971) gegebenen, wenn es nur ein einzelnes Element gibt . Ein anderer Sinn, in dem jQuery-Objekte als gleich angesehen werden können, ist, ob sie denselben Selektor und denselben Kontext haben. Das ist leicht genug zu testen: 'A.selector === B.selector && A.context === B.context'. Oft wird der Kontext immer gleich sein, so dass wir nur den Selektor berücksichtigen müssen. – Casebash

+2

@Casebash - true, aber bedenken Sie, dass mehrere Selektoren mit der gleichen Ergebnismenge enden könnten, zB: '$ (': first')' und '$ ('*: first')' – nickf

+6

[Kleinere Lösung - verwenden Sie $ (a) .is (b) '] (http://stackoverflow.com/q/2448362/9859). – rampion

16

Wenn Sie noch nicht wissen, können Sie das ursprüngliche Objekt von zurückzubekommen.

+1

Die beiden Warnungen werden 'true' anzeigen, weil Sie die Referenz des DOM-Elements vergleichen,' == 'vs' === 'wird Ihnen die gleichen Ergebnisse (keine Art Zwang erforderlich, sie sind nur zwei Objekte) Referenzen) – CMS

+0

Ihre zweite Aussage ist tatsächlich True – Casebash

+0

ah ja, es ist wahr. Kopieren und Einfügen Fehler = D – mauris

8

Es ist im Allgemeinen eine schlechte Idee $ (foo) mit $ (foo) zu vergleichen, wie das zu dem folgenden Vergleich funktional äquivalent ist:

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

Natürlich würden Sie nie „JS erwarten Motor vermasseln". Ich benutze "$" nur, um klar zu machen, was jQuery macht.

Immer wenn Sie $ ("# foo") aufrufen, machen Sie tatsächlich eine jQuery ("# ​​foo"), die ein neues Objekt zurückgibt. Es ist also nicht korrekt, sie zu vergleichen und dasselbe Objekt zu erwarten.

jedoch, was Sie tun können, sein kann, ist so etwas wie:

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

Also eigentlich sollte man vielleicht die ID-Elemente der jQuery-Objekte in Ihrem realen Programm so etwas vergleichen wie

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

ist angemessener.

+1

Nur um klar zu sein, jQuery hat kein Objektattribut. Elf King scheint dies als Pseudocode zu verwenden – Casebash

4

Verwenden Underscore.js isEqual Methode http://underscorejs.org/#isEqual

+2

Verwenden Sie stattdessen lodash: https://lodash.com/docs#isEqual –

+0

@KarlGlaser - Warum? –

11

Die.Lösung ist wahrscheinlich die sauberste und eleganteste.

Ich habe etwas schnell und schmutzig wie folgt versucht:

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

Wahrscheinlich ist teuer, aber die bequeme Sache ist, dass es implizit rekursiv ist, während die elegante Lösung ist es nicht.

Nur meine 2 Cent.

+0

Das ist nicht gut für die Überprüfung der Gleichheit zwischen zwei jQuery-Objekten, sondern für Standardobjekte. wie "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'}". Ich frage mich, dass es keine jQuery.isEqual (a, b) ... – iRaS

+10

Dies ist falsch. Reihenfolge der Objekteigenschaften ist wichtig. Wenn Sie also '{a: 1, b: 2}' und '{b: 2, a: 1}' haben, gibt dies 'false' zurück, wenn es' true' zurückgeben soll. –

+2

@EricAlberson, haben Sie irgendwelche Vorschläge zu anderen tiefen Vergleichstools oder Skripten, die mit dieser Situation umgehen können? –

Verwandte Themen