web-dev-qa-db-fra.com

égalité d'objet jQuery

Comment déterminer si deux objets jQuery sont égaux? J'aimerais pouvoir rechercher dans un tableau un objet jQuery particulier.

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

Depuis jQuery 1.6, vous pouvez utiliser .is . Voici la réponse d'il y a plus d'un an ...

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


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

Si vous voulez voir si deux variables sont réellement le même objet, par exemple:

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

... alors vous pouvez vérifier leurs identifiants uniques. Chaque fois que vous créez un nouvel objet jQuery, il reçoit un identifiant.

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

Bien que la même chose puisse être obtenue avec un simple _a === b_, ce qui précède peut au moins montrer au prochain développeur exactement ce que vous testez.

En tout cas, ce n'est probablement pas ce que vous recherchez. Si vous voulez vérifier si deux objets jQuery différents contiennent le même ensemble d'éléments, vous pouvez utiliser ceci:

_$.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
}
_
213
nickf

Si vous ne savez toujours pas, vous pouvez récupérer l'objet d'origine en:

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

car $("#deviceTypeRoot") renvoie également un tableau d'objets sélectionnés par le sélecteur.

16
mauris

La solution $.fn.equals(...) est probablement la plus propre et la plus élégante.

J'ai essayé quelque chose de rapide et sale comme ça:

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

C'est probablement cher, mais le plus confortable est qu'il est implicitement récursif, contrairement à la solution élégante.

Juste mes 2 cents.

15
Roberto Pierpaoli

En règle générale, c'est une mauvaise idée de comparer $ (foo) à $ (foo) car cela équivaut fonctionnellement à la comparaison suivante:

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

Bien sûr, vous ne vous attendriez jamais à une "erreur de moteur JS". J'utilise "$" juste pour clarifier ce que fait jQuery.

Chaque fois que vous appelez $ ("# foo"), vous effectuez un jQuery ("# ​​foo") qui retourne un nouvel objet. Donc, les comparer et attendre le même objet n'est pas correct.

Cependant, ce que vous POUVEZ faire est quelque chose comme:

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

Alors, en réalité, vous devriez peut-être comparer les éléments d'identification des objets jQuery dans votre programme réel

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

est plus approprié.

9
Elf King

Commencez par commander votre objet en fonction de la clé à l'aide de cette fonction

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

Ensuite, comparez la version stringifiée de votre objet, en utilisant cette fonction

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

Voici un exemple

En supposant que les clés des objets sont ordonnées différemment et ont les mêmes valeurs

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

isEqualObject(obj1,obj2);//returns true
4
Kareem

Utilisez la méthode isEqual Underscore.js http://underscorejs.org/#isEqual

4
Remo H. Jansen

Si vous voulez vérifier que le contenu est égal ou différent, utilisez simplement JSON.stringify (obj)

Par exemple - var a = {key: val};

var b = {clé: val};

JSON.stringify (a JSON.stringify (b)) == -----> Si le contenu est identique, vous obtenez la valeur true.

0
Vikram