2012-02-08 11 views
5

Tengo dos matrices. En cada matriz, tengo objetos con muchas propiedades pero sin métodos. Necesito ver si la matriz 1 es igual a la matriz 2.Comparación de matrices de objetos, forma óptima

Una forma de hacerlo sería crear una función que pase por cada elemento de una matriz y comparar cada propiedad del objeto con el objeto similar posición en el segundo conjunto.

El problema es que las matrices son bastante grandes y también cada objeto tiene muchas propiedades. Estaba vagando si podría haber otra manera. En C++, por ejemplo, pude leer memoria ... pero no sé cómo hacer eso en js.

Necesito obtener la forma más óptima ya que esto es parte de una función que se usa con frecuencia.

+0

[Comparar matriz de javascript de matriz por distintos valores] (http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values) este código puede ayudarlo. – Jugal

Respuesta

4

A menos que sean la misma instancia de matriz, la comparación de las ubicaciones de memoria no funcionará en JavaScript (lo que sucede cuando se hace arr1 == arr2).

Debería realizar un bucle explícito.

Algunas personas utilizan JSON.stringify() (cuidado con el Gotcha explica en los comentarios por pimvdb) en ambas matrices y comparar las cadenas resultantes a engañar, pero serialising en una cadena y la comparación de los sonidos más plenamente caro para mí. Sin embargo, funciona, así que si no hay un problema de rendimiento, ¡vuelvese loco! :)

También puedes probar toSource().

Construiría mi propia función comparativa que compare lo suficiente como para satisfacer mi idea de idéntica.

+0

Hay un problema de rendimiento :). Si comparo arr1 == arr2 siempre devolverá falso ya que la ubicación de la memoria es diferente. Necesito comparar la memoria de esa ubicación con el final de la matriz "en términos de memoria" para ponerlo así con la segunda ubicación hasta el final. PD Disculpe mi inglés. – zozo

+2

@zozo Los arreglos de JavaScript son realmente objetos con algunos métodos y propiedades especiales. Por lo general, no se almacenan de forma secuencial como las implementaciones de matrices de otros idiomas. – alex

+0

No puede acceder a la dirección de la memoria directamente como puede hacerlo en C++. JavaScript es solo una interfaz tonta y todo lo que puedes hacer es comparar los objetos de alguna manera. Yo usaría 'JSON.stringify' también. También hay 'uneval'. –

0

jQuery tiene una función llamada jQuery.param() la que serializa objetos

Puede comparar objetos o conjuntos de objetos como así,

$.param(originalObj) == $.param(modifiedObj) 

Es muy potente en conjunto con jQuery.extend() que puede ser utilizado para clonar objetos

1

La conversión de sus matrices en cadenas y la comparación de las cadenas tendrá el mismo rendimiento promedio y peor: O (n) (lineal).

Si recorre las propiedades/matrices de los objetos y cancela en la primera discrepancia, su peor rendimiento seguirá siendo O (n) pero su rendimiento promedio podría mejorar significativamente a menos que los objetos que compare sean generalmente idénticos. De cualquier manera, dado que este cruce no incluiría la creación de ningún objeto nuevo ni la copia de bytes, incluso la comparación de objetos compuestos/matrices idénticos (el peor de los casos) debería ser aún más rápido que la cadena.

Como respuesta sugiere this es posible que utilices Underscore.js isEqual:

que según documentos: Realiza una comparación de profundidad optimizada entre los dos objetos, para determinar si deben ser considerados iguales

Estoy bastante seguro también funcionará para matrices.

+0

Tienes razón. +1 – zozo