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
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;
};
_
_var a = $('p');
var b = $('p');
if (a.equals(b)) {
// same set
}
_
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.
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.
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é.
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
Utilisez la méthode isEqual Underscore.js http://underscorejs.org/#isEqual
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.