2010-07-05 21 views
120

¿Cómo puedo determinar si dos objetos jQuery son iguales? Me gustaría poder buscar una matriz para un objeto jQuery particular.jQuery object equality

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

Respuesta

186

Desde jQuery 1.6, puede usar .is. A continuación se muestra la respuesta de hace más de un año ...

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


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

Si usted quiere ver si dos variables son en realidad el mismo objeto, por ejemplo:

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

... entonces puede 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, el mismo se podría lograr con un simple a === b, el poder por encima de al menos muestran la próxima desarrollador exactamente lo que está probando para.

En cualquier caso, eso probablemente no sea lo que buscas. Si quería comprobar si dos objetos jQuery diferentes contienen el mismo conjunto de elementos, el que podría utilizar 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; 
}; 

Source método

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

Esta solución simplifica a la dada por [thephpdeveloper] (http://stackoverflow.com/questions/3176962/jquery-object-equality/3176971#3176971) cuando sólo hay un único elemento . Otro sentido en el que los objetos jQuery se pueden considerar iguales es si tienen el mismo selector y el mismo contexto. Esto es bastante fácil de probar: 'A.selector === B.selector && A.context === B.context'. A menudo, el contexto siempre será el mismo, por lo que solo tenemos que considerar el selector. – Casebash

+2

@Casebash - cierto, sin embargo considera que varios selectores podría terminar con el mismo conjunto de resultados, por ejemplo: '$ (': first')' y '$ ('*: first')' – nickf

+6

[solución más pequeño - $ usar ' (a) .is (b) '] (http://stackoverflow.com/q/2448362/9859). – rampion

16

Si todavía no sabe, puede recuperar el objeto original por:

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

porque $("#deviceTypeRoot") también devuelve una matriz de objetos que ha seleccionado el selector.

+1

Los dos alertas mostrarán 'true', debido a que está comparando la referencia del elemento DOM,' '== ===' 'vs le dará los mismos resultados (sin tipo de coacción necesaria, no son más que dos objetos referencias) – CMS

+0

Su segunda afirmación realmente está respondiendo Verdadero – Casebash

+0

ah sí, es verdad. copiar y pegar error = D – mauris

8

Se trata, en general, una mala idea para 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 que nunca se puede esperar "motor de JS atropellado ". Uso "$" solo para aclarar lo que jQuery está haciendo.

Cuando 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 se debe tal vez comparar los elementos de identificación de los objetos jQuery en su programa real para algo así como

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

es más apropiado.

+1

Para que quede claro, jQuery no tiene un atributo de objeto. Elf Rey parece estar usando esto como pseudocódigo – Casebash

4

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

+2

Use lodash en su lugar: https://lodash.com/docs#isEqual –

+0

@KarlGlaser - ¿Alguna razón por qué? –

11

La solución $.fn.equals(...) es probablemente la más limpia y elegante.

que han intentado algo rápido y sucio como esto:

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

Probablemente es caro, pero lo más cómodo es que es implícitamente recursiva, mientras que la solución no es elegante.

Sólo mis 2 centavos.

+0

que no es bueno para verificar la igualdad entre dos objetos jQuery, sino para objetos estándar. como "{a: 'x', b: 'y', c: 'z'} == {a: 'x', b: 'y', c: 'z'}". Me pregunto si no hay jQuery.isEqual (a, b) ... – iRaS

+10

Esto está mal. El orden de las propiedades del objeto es importante. Entonces si tienes '{a: 1, b: 2}' y '{b: 2, a: 1}' esto devolverá 'false' cuando debería devolver' true'. –

+2

@EricAlberson, ¿tiene alguna sugerencia sobre otras herramientas de comparación profunda o scripts que puedan manejar esta situación? –

Cuestiones relacionadas