J'ai ces deux tableaux: l'un est rempli d'informations provenant d'une requête ajax et un autre stocke les boutons sur lesquels l'utilisateur clique. J'utilise ce code (j'ai rempli des exemples de numéros):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Mais ça donne toujours false
, même si les deux tableaux sont identiques, mais avec un nom différent. (J'ai vérifié cela dans la console JS de Chrome). Alors, y a-t-il un moyen de savoir si ces deux tableaux contiennent le même? Pourquoi donne-t-il false
? Comment puis-je savoir quelles valeurs du premier tableau ne figurent pas dans le second?
javascript
arrays
compare
Carlos Precioso
la source
la source
Réponses:
Notez que cela ne modifie pas les tableaux d'origine contrairement à une réponse précédente.
la source
Si les éléments de votre tableau ne sont pas des objets - s'il s'agit de nombres ou de chaînes, par exemple, vous pouvez comparer leurs chaînes jointes pour voir s'ils ont les mêmes membres dans n'importe quel ordre -
la source
['a', 'b']
-à- dire et['a,b']
. Je ne recommanderais cette technique que pour les petits scripts jetables.Si vous souhaitez vérifier uniquement si deux tableaux ont les mêmes valeurs (quels que soient le nombre d'occurrences et l'ordre de chaque valeur), vous pouvez le faire en utilisant lodash :
Bref, simple et joli!
la source
xor
dans les documents de soulignement? Pensez-vous à IODash?Peut être?
la source
Pourquoi votre code n'a pas fonctionné
JavaScript a des types de données primitifs et des types de données non primitifs.
Pour les types de données primitifs,
==
et===
vérifiez si les éléments de chaque côté des barres ont la même valeur. C'est pourquoi1 === 1
c'est vrai.Pour les types de données non primitifs tels que les tableaux,
==
et===
vérifiez l'égalité des références. Autrement dit, ils vérifient siarr1
etarr2
sont le même objet. Dans votre exemple, les deux tableaux ont les mêmes objets dans le même ordre, mais ne sont pas équivalents.Solutions
Deux tableaux,
arr1
etarr2
, ont les mêmes membres si et seulement si:arr2
est dedansarr1
ET
arr1
est dedansarr2
Cela fera donc l'affaire (ES2016):
Cette deuxième solution utilisant Underscore est plus proche de ce que vous essayiez de faire:
Cela fonctionne parce qu'il
isEqual
vérifie «l'égalité profonde», ce qui signifie qu'il regarde plus que simplement l'égalité de référence et compare les valeurs.Une solution à votre troisième question
Vous avez également demandé comment savoir dans quels éléments
arr1
ne sont pas contenusarr2
.Cela le fera (ES2015):
Vous pouvez également utiliser la
difference
méthode Underscore :METTRE À JOUR
Voir le commentaire de @ Redu - ma solution est pour
sameMembers
, mais ce que vous pouvez avoir à l'esprit estsameMembersInOrder
également connu sous le nom dedeepEquals
.MISE À JOUR 2
Si vous ne vous souciez pas de l'ordre des membres des tableaux, ES2015 +
Set
peut être une meilleure structure de données queArray
. Consultez les notes MDN sur la façon d'implémenterisSuperset
et d'difference
utiliser des correctifs dangereux pour les singes.la source
sameMembers([1,1,2],[2,1,2]);
devrait retourner false.sameMembers([1,1,2],[2,1,2])
devrait revenirtrue
, à mon avis.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
devrait revenirfalse
.arr1.filter...
ne fonctionnera que pour vérifier si arr2 a tous les éléments de arr1 ou non, mais pas l'inverse qui est également nécessaire.Vérification de l'égalité des objets:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
Le test ci-dessus fonctionne également avec des tableaux d'objets, auquel cas utilisez une fonction de tri comme documenté dans http://www.w3schools.com/jsref/jsref_sort.asp
Cela peut suffire pour les petits tableaux avec des schémas JSON plats.
la source
Notre objectif est essentiellement de vérifier si 2 tableaux sont des ensembles égaux. set est l' ensemble défini mathématiquement . Le tri le plus rapide prend asymptotiquement le temps O (nlog (n)) . Donc, si vous triez un tableau, cela prendrait au moins O (nlog (n)) temps. Mais vous pouvez effectuer cette tâche plus rapidement , ce qui prend asymptotiquement un temps O (n) (cas moyen et non pire cas) avec une structure de données de dictionnaire. Dans JS, un dictionnaire est simplement un objet avec des clés et des valeurs.
Notez que cette fonction fonctionne avec des tableaux de types primitifs et suppose
a1
eta2
sont des tableaux.la source
Et ça? ES 2017 je suppose:
La première condition vérifie si les deux tableaux ont la même longueur et la deuxième condition vérifie si le premier tableau est un sous-ensemble du deuxième tableau. La combinaison de ces 2 conditions devrait alors aboutir à la comparaison de tous les éléments des 2 tableaux quel que soit l'ordre des éléments.
Le code ci-dessus ne fonctionnera que si les deux tableaux ont des éléments non dupliqués.
la source
Lorsque vous comparez ces deux tableaux, vous comparez les objets qui représentent les tableaux, pas le contenu.
Vous devrez utiliser une fonction pour comparer les deux. Vous pouvez écrire le vôtre qui boucle simplement l'un et le compare à l'autre après avoir vérifié que les longueurs sont les mêmes.
la source
Solution simple pour une égalité superficielle en utilisant ES6:
Crée des copies superficielles de chaque tableau et les trie. Puis utilise
some()
pour parcourir lesarr1test
valeurs, en vérifiant chaque valeur par rapport à la valeur dansarr2test
avec le même index. Si toutes les valeurs sont égales, lessome()
rendementsfalse
, et à son tourequal
evalue àtrue
.Pourrait également utiliser
every()
, mais il faudrait parcourir chaque élément du tableau pour satisfaire untrue
résultat, alors qu'ilsome()
sera libéré dès qu'il trouve une valeur qui n'est pas égale:la source
J'avais des valeurs entières simples dans un projet de jeu
Avait moins de valeurs dans chaque tableau, aussi, avait besoin de ce tableau d'origine intact
, j'avais donc fait ce qui suit, cela a bien fonctionné. (Code modifié pour coller ici)
J'espère que cela pourra aider.
la source
Utilisation d'ES6
Nous utiliserons la
equals
fonction de Ramda , mais à la place, nous pouvons utiliser celle de Lodash ou UnderscoreisEqual
:En utilisant l'opportateur de diffusion, nous évitons de muter les tableaux d'origine et nous gardons notre fonction pure.
la source
Vous pouvez utiliser à la
reduce
place des boucles pour paraître intelligent, mais au risque de voir vos collègues développeurs vous considérer comme un âne intelligent.la source
Si les éléments du tableau sont des primitives (nombres ou caractères uniques), vous pouvez utiliser une combinaison de comparaison de longueurs et d'ensembles.
la source
Nous sommes déjà en 2020 mais j'ai remarqué que la plupart des autres solutions utilisent le tri, O (n * log n), utilisent des bibliothèques ou ont une complexité O (n ^ 2).
Voici une solution Javascript pure de complexité linéaire, O (n):
Tests:
la source
Si vous utilisez Prototype Framework, vous pouvez utiliser la méthode intersect d'un tableau pour découvrir qu'ils sont identiques (quel que soit l'ordre):
la source
[1,2].intersect([1,2,3]).length === [1,2].length
renvoie vrai. Vous devriez également comparer la longueur des tableaux d'origine, j'ai édité l'article pour le démontrer.array1 = [1,1,2]; array2 = [1,1,2];
... la réponse d'origine n'échoue pas pour cette entrée._.difference(array1, array2).length;
veuillez vérifier cette réponse
la source
return
sera sans effet. Deuxièmement, vous devez vérifier les tableaux triés, car[1,2]
et[2,1]
seront détectés comme étant différents. Troisièmement et le plus important, cela ne vérifiera en fait que si un élément est le même. Le conditionnel devrait êtreif (array1!==array2) {return false;}
. Peut-être que cela peut vous aider à l'avenir!array1
etarray2
pourrait être renomméelem1
etelem2
. Ces deux conseils vous éviteront bien des maux de tête à l'avenir!Répondre après longtemps, mais j'espère que cela aidera quelqu'un qui recherche une solution simple et des débutants modernes.
Nous pouvons maintenant y parvenir en utilisant plusieurs bibliothèques comme
lodash
,underscore
, etc. (Ceux - ci devient une partie du projet de nos jours , en raison de la simplicité, de multiples fonctionnalités et une utilisation élevée)Vous pouvez utiliser l'intersection de la bibliothèque lodash.
Cela fonctionnera pour tout type de données.
la source
Si vous voulez comparer deux tableaux et vérifier si un objet est le même dans les deux tableaux, cela fonctionnera. Exemple :
Array1 = [a, b, c, d]
Array2 = [d, e, f, g]
Ici, «d» est commun dans les deux tableaux, donc cette fonction retournera la valeur vraie.
la source
Essaye ça
la source
J'ai un autre moyen basé sur la réponse acceptée.
la source
Une fonction pour comparer deux tableaux, pour vérifier si les deux ont les mêmes éléments. Même s'ils sont en panne ...
C'est bon pour les tableaux simples. [String, Number, Boolean, null, NaN].
Je n'utilise pas .sort (), cela modifie le tableau d'origine. Certains disent que c'est mauvais ...
Mise en garde. Cette fonction est limitée, elle ne peut pas comparer les objets "[], {}" ou les fonctions de ces tableaux, les tableaux sont des objets.
la source
Solution simple pour comparer les deux tableaux:
la source