6
votes

Comparer des tableaux d'objets, de manière optimale

J'ai deux tableaux. Dans chaque tableau, j'ai des objets avec beaucoup de propriétés mais aucune méthode. J'ai besoin de voir si le tableau 1 est égal avec un tableau 2.

Un moyen de faire cela serait de créer une fonction qui passe à travers chaque élément d'une matrice et de comparer chaque propriété de l'objet avec l'objet dans la position similaire dans la deuxième matrice.

Le problème est que les matrices sont assez grandes et que chaque objet a de nombreuses propriétés. J'étais errant s'il pouvait y avoir une autre façon. En C ++, par exemple, je pouvais lire la mémoire ... mais je ne sais pas comment faire cela dans JS.

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


3 Réponses :


4
votes

Sauf si elles sont 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 faites arr1 == arr2 ).

Vous auriez besoin de boucle explicitement.

Certaines personnes utilisent JSON.Stringify () (SURVEILLER POUR LE GOTCHA Expliqué dans les commentaires de PIMVDB ) sur les deux tableaux et comparez les chaînes obtenues à triche , mais sérialisation à une chaîne et comparer des sons entièrement coûteux pour moi. Cependant, cela fonctionne, donc s'il n'y a pas de problème de performance, allez-y fou! :)

Vous pouvez également essayer Tosource () .

Je construirais ma propre fonction comparative qui se compare juste suffisante qui satisfait mon idée de identique .


5 commentaires

Il y a un problème de performance :). Si je compare Arr1 == Arr2 retournera toujours false puisque l'emplacement de la mémoire est différent. J'ai besoin de comparer la mémoire de cet emplacement à la fin de la matrice "en termes de mémoire" pour le mettre comme ça avec le deuxième emplacement à la fin. P.s. S'il vous plaît excuser mon anglais.


@zozo JavaScript Les matrices sont vraiment des objets avec des méthodes et des propriétés spéciales. Ils ne sont généralement pas stockés de manière séquentielle comme les implémentations d'autres langues de tableaux.


Vous ne pouvez pas accéder à l'adresse de la mémoire directement que possible en C ++. JavaScript n'est qu'une interface muette et tout ce que vous pouvez faire est de comparer les objets en quelque sorte. J'utiliserais json.stringify aussi. Il y a aussi inégal .


Ouais ... Donc, fondamentalement, je ne peux pas éviter les 2 boucles. Cela craint. : |


json.stringify semble dépendre de la commande dans laquelle les propriétés ont été ajoutées. JSON.Stringify ({A: 1, B: 2}) === JSON.Stringify ({B: 2, A: 1}) Produits Faux , donc je Vraiment ne pas le recommander.



0
votes

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

vous Peut comparer des objets ou des tableaux d'objets tels que, P>

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


0 commentaires

1
votes

convertir vos tableaux en chaînes puis comparer les chaînes aura la même performance moyenne et la même performance: O (n) (linéaire).

Si vous bouclez les propriétés / les tableaux de vos objets et à avorter sur la 1ère inadéquation, vos pires performances seront toujours O (n), mais votre performance moyenne pourrait améliorer considérablement, à moins que les objets que votre comparaison soit généralement identique. De toute façon, puisque cette traversée n'inclurait pas la création de nouveaux objets et une copie d'octets autour - même comparer des objets / tableaux composites identiques (les pires cas) devrait encore être plus rapide que les stringifiants.

comme Cette Réponse suggère que vous pouvez simplement utiliser SAINSTSCORRE.JS ISEQUAL :

qui selon DOCS: effectue une comparaison profonde optimisée entre les deux objets, pour déterminer s'ils doivent être considérés comme égaux

Je suis à peu près sûr que cela fonctionnera aussi pour les tableaux.


0 commentaires