2010-07-05 1 views
120

Come determinare se due oggetti jQuery sono uguali? Mi piacerebbe essere in grado di cercare una matrice per un particolare oggetto jQuery.jQuery object ugality

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

risposta

186

Da jQuery 1.6, è possibile utilizzare .is. Qui di seguito è la risposta da più di un anno fa ...

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


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

Se volete vedere se due variabili sono in realtà lo stesso oggetto, ad esempio:

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

... poi si può controllare i loro ID univoci. Ogni volta che crei un nuovo oggetto jQuery ottiene un ID.

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

Anche se, lo stesso potrebbe essere raggiunto con una semplice a === b, quanto sopra potrebbe almeno mostrano la prossima sviluppatore esattamente ciò che si sta testando per.

In ogni caso, probabilmente non è quello che cerchi. Se si voleva verificare se due diversi oggetti jQuery contengono lo stesso insieme di elementi, la si potrebbe usare questo:

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

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

Questa soluzione si semplifica a quella data da [thephpdeveloper] (http://stackoverflow.com/questions/3176962/jquery-object-equality/3176971#3176971) quando c'è un solo elemento . Un altro senso in cui gli oggetti jQuery possono essere considerati uguali è se hanno lo stesso selettore e il medesimo contesto. Questo è abbastanza facile da testare: 'A.selector === B.selector && A.context === B.context'. Spesso il contesto sarà sempre lo stesso, quindi dobbiamo solo considerare il selettore. – Casebash

+2

@Casebash - true, tuttavia, considera che molti selettori potrebbero finire con lo stesso set di risultati, ad esempio: '$ (': first')' e '$ ('*: first')' – nickf

+6

[Soluzione più piccola - usa $ (a) .è (b) '] (http://stackoverflow.com/q/2448362/9859). – rampion

16

Se ancora non si sa, si può tornare indietro l'oggetto originale da:

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

perché $("#deviceTypeRoot") restituisce anche una serie di oggetti che ha selezionato il selettore.

+1

I due avvisi visualizzeranno 'true', perché stai confrontando il riferimento dell'elemento DOM,' == 'vs' === 'ti darà gli stessi risultati (non è necessaria alcuna coercizione di tipo, sono solo due oggetti riferimenti) – CMS

+0

La tua seconda affermazione sta effettivamente restituendo True – Casebash

+0

ah sì è vero. copia e incolla errore = D – mauris

8

E ', in generale, è una cattiva idea per confrontare $ (foo) con $ (foo) come quello è funzionalmente equivalente al seguente paragone:

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

Naturalmente si sarebbe mai aspettare "motore JS rovinare". Io uso "$" solo per chiarire cosa sta facendo jQuery.

Ogni volta che si chiama $ ("# pippo") si sta effettivamente facendo un jQuery ("# ​​pippo") che restituisce un nuovo oggetto. Quindi confrontarli e aspettarsi lo stesso oggetto non è corretto.

Tuttavia ciò che si può fare può essere è qualcosa di simile:

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

Quindi, in realtà si dovrebbe forse confrontare gli elementi identificativi degli oggetti jQuery nel programma vero e proprio in modo da qualcosa come

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

è più appropriato.

+1

Giusto per essere chiari, jQuery non ha un attributo oggetto. Elf King sembra utilizzarlo come pseudocodice – Casebash

4

Usa Underscore.js IsEqual http://underscorejs.org/#isEqual

+2

Usa invece lodash: https://lodash.com/docs#isEqual –

+0

@KarlGlaser - Qualche ragione per cui? –

11

La soluzione $.fn.equals(...) è probabilmente la più pulita ed elegante.

ho cercato qualcosa di veloce e sporco come questo:

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

Probabilmente è costoso, ma la cosa comoda è che è implicitamente ricorsivo, mentre la soluzione elegante non lo è.

Solo i miei 2 centesimi.

+0

non va bene per controllare l'uguaglianza tra due oggetti jQuery ma per oggetti standard. come "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'}". mi chiedo che non ci sia jQuery.isEqual (a, b) ... – iRaS

+10

Questo è sbagliato. L'ordine delle proprietà dell'oggetto è importante. Quindi se avete '{a: 1, b: 2}' e '{b: 2, a: 1}' questo restituirà 'false' quando dovrebbe restituire' true'. –

+2

@EricAlberson, hai qualche suggerimento su altri strumenti o script di confronto profondo che potrebbero gestire questa situazione? –