Tengo dos matrices de objetos JavaScript que me gustaría comparar para ver si son iguales. Es posible que los objetos no estén (y probablemente no lo estarán) en el mismo orden en cada matriz. Cada matriz no debe tener más de 10 objetos. Pensé que jQuery podría tener una solución elegante para este problema, pero no pude encontrar mucho en línea.
Sé que una $.each(array, function(){})
solución anidada bruta podría funcionar, pero ¿hay alguna función incorporada que no conozca?
Gracias.
[0,1] == {0:0,1:1,length=2}
$(arr1).not(arr2).length == 0
Por qué no es suficiente?not
es una función de filtro, no una función de igualdad. Pruébelo con[1,2]
y[1]
. En un orden, obtendrá[]
, y en otro, obtendrá[2]
.not
ya no funciona con objetos genéricos a partir de 3.0.0-rc1. Ver github.com/jquery/jquery/issues/3147También estaba buscando esto hoy y encontré: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD
No sé si es una buena solución, aunque mencionan algunas consideraciones de rendimiento que se tienen en cuenta.
Me gusta la idea de un método auxiliar de jQuery. @David Preferiría ver que tu método de comparación funcione así:
No tiene sentido para mí hacer:
donde ayb son matrices. Normalmente, cuando $ (algo) estaría pasando una cadena de selección para trabajar con elementos DOM.
También con respecto a ordenar y 'almacenar en caché' las matrices ordenadas:
Parece que lo que tenemos que hacer es copiar las matrices antes de trabajar en ellas. ¡La mejor respuesta que pude encontrar sobre cómo hacer eso de una manera jQuery fue nada menos que John Resig aquí en SO! ¿Cuál es la forma más eficiente de clonar en profundidad un objeto en JavaScript? (vea los comentarios sobre su respuesta para la versión de matriz de la receta de clonación de objetos)
En cuyo caso, creo que el código sería:
fuente
Mi enfoque fue bastante diferente: aplané ambas colecciones usando JSON.stringify y usé una cadena de comparación normal para verificar la igualdad.
Es decir
NB: Tenga en cuenta que este método asume que ambas colecciones están ordenadas de manera similar, si no, ¡le daría un resultado falso!
fuente
Convierta ambos arreglos en cadena y compare
fuente
Encontré esta discusión porque necesitaba una forma de comparar en profundidad matrices y objetos. Usando los ejemplos aquí, se me ocurrió lo siguiente (dividido en 3 métodos para mayor claridad):
Pruebas
fuente
En mi caso, las matrices comparadas contienen solo números y cadenas . Esta solución funcionó para mí:
¡Probémoslo!
fuente
No creo que haya una buena forma "jQuery" de hacer esto, pero si necesita eficiencia, asigne una de las matrices con una determinada clave (uno de los campos de objeto único) y luego haga una comparación recorriendo la otra matriz y comparando con el mapa, o matriz asociativa, que acaba de crear.
Si la eficiencia no es un problema, simplemente compare cada objeto en A con cada objeto en B. Siempre que | A | y | B | son pequeños, debería estar bien.
fuente
Bueno, si desea comparar solo el contenido de las matrices, hay una función jQuery útil $ .inArray ()
fuente
Cambiar matriz a cadena y comparar
fuente
El bonito trazador de líneas de Sudhakar R como método global jQuery.
fuente
También encontré esto cuando buscaba hacer algunas comparaciones de matrices con jQuery. En mi caso, tenía cadenas que sabía que eran matrices:
Pero me importaba si era una coincidencia completa o solo una coincidencia parcial, así que usé algo como lo siguiente, basado en la respuesta de Sudhakar R:
fuente
Si los duplicados importan de manera que
[1, 1, 2]
no deberían ser iguales[2, 1]
pero deberían ser iguales[1, 2, 1]
, aquí hay una solución de recuento de referencia:Aquí está el violín para jugar .
fuente
fuente
Prueba esto
fuente