equality - objects - jquery type
igualdad de objetos jQuery (7)
Desde jQuery 1.6, puedes usar .is
. A continuación está la respuesta de hace más de un año ...
var a = $(''#foo'');
var b = a;
if (a.is(b)) {
// the same object!
}
Si desea ver si dos variables son en realidad el mismo objeto, por ejemplo:
var a = $(''#foo'');
var b = a;
... entonces puedes verificar sus identificaciones únicas. Cada vez que creas un nuevo objeto jQuery obtiene una identificación.
if ($.data(a) == $.data(b)) {
// the same object!
}
Sin embargo, lo mismo podría lograrse con un simple a === b
, lo anterior al menos podría mostrar al siguiente desarrollador exactamente lo que está probando.
En cualquier caso, eso probablemente no es lo que buscas. Si desea verificar si dos objetos jQuery diferentes contienen el mismo conjunto de elementos, puede usar esto:
$.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
}
¿Cómo determino si dos objetos jQuery son iguales? Me gustaría poder buscar una matriz para un objeto jQuery particular.
$.inArray(jqobj, my_array);//-1
alert($("#deviceTypeRoot") == $("#deviceTypeRoot"));//False
alert($("#deviceTypeRoot") === $("#deviceTypeRoot"));//False
En general, es una mala idea comparar $ (foo) con $ (foo) ya que es funcionalmente equivalente a la siguiente comparación:
<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>
Por supuesto, nunca esperarías que "el motor JS se enrede". Uso "$" solo para aclarar lo que jQuery está haciendo.
Siempre que llame a $ ("# foo"), en realidad está haciendo un jQuery ("# foo") que devuelve un nuevo objeto . Entonces compararlos y esperar el mismo objeto no es correcto.
Sin embargo, lo que PUEDE hacer puede ser algo así como:
<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>
Así que, en realidad, quizás debas comparar los elementos ID de los objetos jQuery en tu programa real, así que algo así como
...
$(someIdSelector).attr("id") == $(someOtherIdSelector).attr("id")
es mas apropiado
La $.fn.equals(...)
es probablemente la más limpia y elegante.
He intentado algo rápido y sucio como este:
JSON.stringify(a) == JSON.stringify(b)
Es probablemente costoso, pero lo más cómodo es que es implícitamente recursivo, mientras que la solución elegante no lo es.
Solo mis 2 centavos.
Primer orden su objeto basado en la clave con esta función
function sortObject(o) {
return Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
}
Luego, compare la versión codificada de su objeto, usando esta función
function isEqualObject(a,b){
return JSON.stringify(sortObject(a)) == JSON.stringify(sortObject(b));
}
Aquí hay un ejemplo, con objetos de un orden diferente y las mismas claves y valores
var obj1 = {"hello":"hi","world":"earth"}
var obj2 = {"world":"earth","hello":"hi"}
isEqualObject(obj1,obj2);//returns true
Si aún no lo sabe, puede recuperar el objeto original de la siguiente manera:
alert($("#deviceTypeRoot")[0] == $("#deviceTypeRoot")[0]); //True
alert($("#deviceTypeRoot")[0] === $("#deviceTypeRoot")[0]);//True
porque $("#deviceTypeRoot")
también devuelve una matriz de objetos que el selector ha seleccionado.
Si quiere comprobar que los contenidos son iguales o no, solo use JSON.stringify (obj)
Por ejemplo, var a = {key: val};
var b = {clave: val};
JSON.stringify (a) == JSON.stringify (b) -----> Si el contenido es el mismo, se cumple.
Use Underscore.js isEqual method http://underscorejs.org/#isEqual