J'ai recherché ici pour une méthode de qualité pour comparer les tableaux associatifs dans JavaScript. La seule solution décente que j'ai trouvée est le Projet PHP.JS qui possède certaines fonctions de tableau comparatif. Le seul problème est que ces fonctions considèrent la première matrice comme clé de la seconde. Dans ma situation au moins, les deux tableaux n'ont pas toujours le même nombre de clés ni les mêmes clés. Cela provoque les fonctions de produire des résultats qui n'incluent pas les clés qui n'auraient peut-être pas existé dans Array1 mais existaient dans Array2. La seule chose que je puisse penser jusqu'à présent consiste à exécuter la fonction Array_Diff_associative () deux fois avec les arguments retournés, puis les combiner (ce qui semble problématique car le premier argument à nouveau est utilisé à nouveau comme clé de la seconde). P>
Toute suggestion? Merci. P>
3 Réponses :
Je pense que ce qui suit devrait faire ce que vous voulez:
function nrKeys(a) { var i = 0; for (key in a) { i++; } return i; } function compareAssociativeArrays(a, b) { if (a == b) { return true; } if (nrKeys(a) != nrKeys(b)) { return false; } for (key in a) { if (a[key] != b[key]) { return false; } } return true; }
Vous vous demandez simplement que votre première comparaison dans la comparaison comparaisse-t-elle être si (A === B)?
Votre solution a deux inconvénients: (1) il retournerait mal vrai dans le cas où A et B ont les mêmes tailles, et a une clé qui pointe sur une valeur non définie, alors que B n'a pas cette clé. (2) Il retournerait mal fausse dans le cas où il existe deux valeurs à l'intérieur d'A et B, qui ont les mêmes valeurs, mais sont en fait des objets et ne sont pas égaux par un opérateur "==". Bien que ce soit facile à réparer (1), cela nécessiterait plus d'efforts pour fixer (2). En tant que solution alternative, j'utiliserais juste un Tostring () B>, ou même plus rapide, Joindre ('') B> Méthode pour comparer deux chaînes.
Un inconvénient est que Tostring () ne fonctionne pas dans Netscape 2 et Explorer 3
J'ai mis à jour cette fonction: Gist.github.com/skylord123/E595F97516E979C40905657527844C46 peut être utile pour Certains malgré cette question étant vraiment vraiment vieux.
Je ne sais vraiment pas s'il y a un moyen plus agréable de le faire que l'approche de la force brute: aussi, ce sont des objets, pas des tableaux et certaines propriétés ne seront pas Enumérable à travers pour..in (comme Array.length, par exemple), prenez-la en compte pour votre application. p> p>
C'est une question ancienne, mais comme elle apparaît d'abord dans une recherche Google pour la comparaison de tableaux, je pensais que je voudrais lancer dans une solution alternative qui fonctionne même lorsque le tableau a deux objets différents avec les mêmes valeurs.
function arrays_equal(a, b) { return JSON.stringify(a) == JSON.stringify(b); }