2012-02-08 2 views
5

J'ai deux tableaux. Dans chaque tableau, j'ai des objets avec beaucoup de propriétés mais pas de méthodes. J'ai besoin de voir si le tableau 1 est égal au tableau 2.Comparer des tableaux d'objets, manière optimale

Une façon de le faire serait de créer une fonction qui traverse chaque élément d'un tableau et de comparer chaque propriété de l'objet avec l'objet dans le même position dans le second tableau.

Le problème est que les tableaux sont assez grands et que chaque objet a aussi beaucoup de propriétés. Je me promenais s'il y avait un autre moyen. En C++ par exemple je pourrais lire la mémoire ... mais je ne sais pas comment faire ça en js.

J'ai besoin d'obtenir la manière la plus optimale car cela fait partie d'une fonction qui est souvent utilisée.

+0

[Comparer tableau javascript de tableau par des valeurs distinctes] (http://stackoverflow.com/questions/18657232/compare-javascript-array-of-array-by-distinct-values) ce code peut vous aider. – Jugal

Répondre

4

Sauf s'il s'agit de la même instance de tableau, la comparaison des emplacements de mémoire ne fonctionnera pas en JavaScript (que se passe-t-il lorsque vous exécutez arr1 == arr2).

Vous auriez besoin de faire une boucle explicite.

Certaines personnes utilisent JSON.stringify() (attention à la chasse aux sorcières a expliqué dans les commentaires par pimvdb) sur les deux tableaux et comparer les chaînes résultantes à tricher, mais sérialisation à une chaîne et la comparaison des sons plus complètement cher pour moi. Cependant, cela fonctionne, donc s'il n'y a pas de problème de performance, allez fou! :)

Vous pouvez également essayer toSource().

Je voudrais construire ma propre fonction comparative qui compare juste assez qui satisfait mon idée de identique.

+0

Il y a un problème de performance :). Si je compare arr1 == arr2 retournera toujours faux car l'emplacement mémoire est différent. J'ai besoin de comparer la mémoire de cet endroit à la fin du tableau "en termes de mémoire" pour le mettre comme ça avec le deuxième emplacement à la fin. P.S. S'il vous plaît excusez mon anglais. – zozo

+2

@zozo Les tableaux JavaScript sont vraiment des objets avec des méthodes et des propriétés spéciales. Ils ne sont généralement pas stockés séquentiellement comme les implémentations de tableaux d'autres langages. – alex

+0

Vous ne pouvez pas accéder directement à la mémoire comme vous le pouvez en C++. JavaScript est juste une interface stupide et tout ce que vous pouvez faire est de comparer les objets en quelque sorte. J'utiliserais 'JSON.stringify' aussi. Il y a aussi 'unval'. –

0

JQuery a une fonction appelée jQuery.param() qui sérialise objets

Vous pouvez comparer des objets ou des tableaux d'objets comme si,

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

Il est très puissant en conjonction avec jQuery.extend() qui peut être utilisé pour cloner des objets

1

La conversion de vos tableaux en chaînes et la comparaison des chaînes auront les mêmes performances moyennes et pires: O (n) (linéaire). Si vous faites une boucle dans vos propriétés/tableaux d'objets et que vous abandonnez lors de la première incohérence, votre pire performance sera toujours O (n), mais votre performance moyenne pourrait s'améliorer considérablement sauf si les objets que vous comparez sont généralement identiques. D'une manière ou d'une autre, puisque cette traversée n'inclurait pas la création de nouveaux objets et la copie des octets, même la comparaison d'objets/tableaux composites identiques (le pire des cas) devrait être plus rapide que de les enchaîner.

Comme this réponse vous suggère pouvez simplement utiliser Underscore.js isEqual:

qui, selon docs: Réalise une comparaison en profondeur optimisée entre les deux objets, pour déterminer si elles doivent être considérées comme égales

Je suis assez sûr cela fonctionnera aussi pour les tableaux.

+0

Vous avez raison. +1 – zozo