J'ai deux tableaux d'objets JavaScript que j'aimerais comparer pour voir s'ils sont identiques. Les objets peuvent ne pas (et ne seront probablement pas) dans le même ordre dans chaque tableau. Chaque tableau ne doit pas avoir plus de 10 objets. Je pensais que jQuery pourrait avoir une solution élégante à ce problème, mais je n'ai pas pu trouver grand-chose en ligne.
Je sais qu'une $.each(array, function(){})
solution imbriquée brute pourrait fonctionner, mais y a-t-il une fonction intégrée dont je ne suis pas au courant?
Merci.
[0,1] == {0:0,1:1,length=2}
$(arr1).not(arr2).length == 0
ne suffit pas?not
c'est une fonction de filtre, pas une fonction d'égalité. Essayez-le avec[1,2]
et[1]
. Dans un ordre, vous obtiendrez[]
, et dans un autre, vous obtiendrez[2]
.not
ne fonctionne plus avec les objets génériques à partir de 3.0.0-rc1. Voir github.com/jquery/jquery/issues/3147Je cherchais également ceci aujourd'hui et j'ai trouvé: http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD
Je ne sais pas si c'est une bonne solution, bien qu'ils mentionnent certaines considérations de performances prises en compte.
J'aime l'idée d'une méthode d'aide jQuery. @David Je préfère voir votre méthode de comparaison fonctionner comme:
Je n'ai pas de sens à faire:
où a et b sont des tableaux. Normalement, lorsque vous $ (quelque chose), vous passez une chaîne de sélection pour travailler avec des éléments DOM.
En ce qui concerne également le tri et la mise en cache des tableaux triés:
Il semble que ce que nous devons faire est de copier les tableaux avant de travailler dessus. La meilleure réponse que j'ai pu trouver pour savoir comment faire cela d'une manière jQuery était par nul autre que John Resig ici sur SO! Quelle est la manière la plus efficace de cloner en profondeur un objet en JavaScript? (voir les commentaires sur sa réponse pour la version tableau de la recette de clonage d'objet)
Dans ce cas, je pense que le code pour cela serait:
la source
Mon approche était assez différente - j'ai aplati les deux collections en utilisant JSON.stringify et utilisé une chaîne normale de comparaison pour vérifier l'égalité.
C'est à dire
NB: Veuillez noter que sa méthode suppose que les deux Collections sont triées de la même manière, sinon, cela vous donnerait un faux résultat!
la source
Convertir les deux tableaux en chaîne et comparer
la source
J'ai trouvé cette discussion parce que j'avais besoin d'un moyen de comparer en profondeur les tableaux et les objets. En utilisant les exemples ici, j'ai trouvé ce qui suit (divisé en 3 méthodes pour plus de clarté):
Essai
la source
Dans mon cas, les tableaux comparés ne contiennent que des nombres et des chaînes . Cette solution a fonctionné pour moi:
Testons-le!
la source
Je ne pense pas qu'il y ait un bon moyen "jQuery" de faire cela, mais si vous avez besoin d'efficacité, mappez l'un des tableaux par une certaine clé (l'un des champs d'objet uniques), puis faites une comparaison en passant par l'autre tableau et en comparant avec la carte, ou le tableau associatif, que vous venez de construire.
Si l'efficacité n'est pas un problème, comparez simplement chaque objet de A à chaque objet de B. Tant que | A | et | B | sont petits, ça devrait aller.
la source
Eh bien, si vous souhaitez comparer uniquement le contenu des tableaux, il existe une fonction jQuery utile $ .inArray ()
la source
Changer le tableau en chaîne et comparer
la source
Le joli one liner de Sudhakar R comme méthode globale jQuery.
la source
J'ai également trouvé cela en cherchant à faire des comparaisons de tableaux avec jQuery. Dans mon cas, j'avais des chaînes que je savais être des tableaux:
Mais je me souciais si c'était une correspondance complète ou seulement une correspondance partielle, alors j'ai utilisé quelque chose comme ce qui suit, basé sur la réponse de Sudhakar R:
la source
Si les doublons ont une importance telle qu'ils
[1, 1, 2]
ne devraient pas être égaux[2, 1]
mais devraient être égaux[1, 2, 1]
, voici une solution de comptage de référence:Voici le violon avec lequel jouer .
la source
la source
Essaye ça
la source