Uguaglianza dell'oggetto jQuery


151

Come posso determinare se due oggetti jQuery sono uguali? Vorrei essere in grado di cercare un array per un particolare oggetto jQuery.

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

Risposte:


225

Da jQuery 1.6, è possibile utilizzare .is. Di seguito è la risposta di oltre un anno fa ...

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


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

Se vuoi vedere se due variabili sono effettivamente lo stesso oggetto, ad esempio:

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

... quindi puoi controllare i loro ID univoci. Ogni volta che crei un nuovo oggetto jQuery ottiene un ID.

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

Tuttavia, lo stesso potrebbe essere ottenuto con un semplice a === b, quanto sopra potrebbe almeno mostrare allo sviluppatore successivo esattamente quello per cui stai testando.

In ogni caso, probabilmente non è quello che stai cercando. Se si desidera verificare se due diversi oggetti jQuery contengono lo stesso set di elementi, è possibile utilizzare 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;
};

fonte

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

Questa soluzione si semplifica a quella fornita da thephpdeveloper quando c'è un solo elemento. Un altro senso in cui gli oggetti jQuery possono essere considerati uguali è se hanno lo stesso selettore e contesto. Questo è abbastanza facile da prova: 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 diversi selettori potrebbero finire con lo stesso set di risultati, ad esempio: $(':first')e$('*:first')
nickf

3
Attenzione @rampion e nickf, jQuery is () non controlla che i selettori siano identici , ma semplicemente che si sovrappongano. Testimone: jsfiddle.net/bnhkm/1
Bob Stein,

la tua equalsfunzione sembra essere sensibile all'ordine. qualcosa come stackoverflow.com/a/29648479 funzionerebbe in più casi, anche se è più lento.
Jayen,

la funzione equals funziona solo se l'oggetto ha un livello! confrontando a = b = [{dir: 'test', ordina: [{test: {test: 1}}]}] non funziona
DavidDunham,

16

Se ancora non lo sai, puoi recuperare l'oggetto originale:

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

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


1
Verranno visualizzati i due avvisi true, poiché stai confrontando il riferimento dell'elemento DOM, ==vs ===ti darà gli stessi risultati (non è necessaria alcuna coercizione di tipo, sono solo due riferimenti a oggetti)
CMS

La tua seconda affermazione in realtà restituisce True
Casebash il

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

14

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

Ho provato 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.


1
non va bene per verificare 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

13
Questo è sbagliato. L'ordine delle proprietà dell'oggetto è importante. Quindi se hai {a: 1, b: 2}e {b: 2, a: 1}questo tornerà falsequando dovrebbe tornare true.
Eric Alberson,

3
@EricAlberson, hai qualche suggerimento su altri strumenti o script di confronto approfonditi che potrebbero gestire questa situazione?
Neil Monroe,

8

In generale, è una cattiva idea confrontare $ (foo) con $ (foo) poiché questo è funzionalmente equivalente al seguente confronto:

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

Ovviamente non ti aspetteresti mai "JS engine screw-up". Uso "$" solo per chiarire cosa sta facendo jQuery.

Ogni volta che chiami $ ("# foo") stai effettivamente eseguendo un jQuery ("# ​​foo") che restituisce un nuovo oggetto . Quindi confrontarli e aspettarsi lo stesso oggetto non è corretto.

Tuttavia, ciò che PUOI fare potrebbe essere qualcosa del tipo:

<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 davvero dovresti forse confrontare gli elementi ID degli oggetti jQuery nel tuo vero programma in modo simile

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

è più appropriato.


1
Per essere chiari, jQuery non ha un attributo oggetto. Sembra che Elf King lo stia usando come pseudocodice
Casebash il


4

Ordinare innanzitutto l'oggetto in base al tasto utilizzando questa funzione

function sortObject(o) {
    return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}

Quindi, confronta la versione ridotta dell'oggetto, usando questa funzione

function isEqualObject(a,b){
    return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}

Ecco un esempio

Supponendo che le chiavi degli oggetti siano ordinate diversamente e abbiano gli stessi valori

var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}

isEqualObject(obj1,obj2);//returns true

-1

Se vuoi controllare che i contenuti siano uguali o no, usa JSON.stringify (obj)

Ad esempio - var a = {key: val};

var b = {chiave: val};

JSON.stringify (a) == JSON.stringify (b) -----> Se i contenuti sono gli stessi, diventi realtà.


Devi prima ordinare le chiavi come nella risposta di Kareem
reggaeguitar il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.