Je sais que je peux le faire en utilisant des boucles, mais j'essaie de trouver une façon élégante de le faire:
J'ai deux tableaux:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Je veux utiliser lodash
pour confirmer que les deux tableaux ci-dessus sont identiques. Par «le même», je veux dire qu'il n'y a aucun élément array1
qui ne soit contenu dans array2
.
En termes de vérification de l'égalité entre ces éléments:
['a', 'b'] == ['b', 'a']
ou
['a', 'b'] == ['a', 'b']
Les deux fonctionnent puisque les lettres seront toujours en ordre.
la source
.sort()
mute et suggérant des options pour la copie en premier si cela pose un problème pour l'utilisateur._.isEqual(_.sortBy(array1), _sortBy(array2))
éviter la mutation.Vous pouvez utiliser des lodashs
xor
pour celaSi vous considérez que le tableau [1, 1] est différent du tableau [1], vous pouvez améliorer les performances un peu comme ceci:
la source
_.xor([3,4], [4,3]).length == 0
rendra vrai.Vous pouvez utiliser Aplatir () et la différence () pour ce qui fonctionne bien si vous ne vous inquiétez pas s'il y a des éléments dans
array2
ce ne sont pas dansarray1
. On dirait que vous demandez si array1 est un sous-ensemble de array2 ?la source
Il y a déjà des réponses ici, mais voici mon implémentation JS pure. Je ne sais pas si c'est optimal, mais c'est sûr que c'est transparent, lisible et simple.
La raison en
contains()
est que sia
contient tous les éléments deb
, les mettre dans le même ensemble ne changerait pas la taille.Par exemple, si
const a = [1,2,3,4]
etconst b = [1,2]
, alorsnew Set([...a, ...b]) === {1,2,3,4}
. Comme vous pouvez le voir, l'ensemble résultant a les mêmes éléments quea
.À partir de là, pour le rendre plus concis, nous pouvons le résumer comme suit:
la source
PURE JS (fonctionne également lorsque les tableaux et sous-tableaux ont plus de 2 éléments avec un ordre arbitraire). Si les chaînes contient l'
,
utilisation commejoin('-')
caractère Parametr (peut être utf) qui ne sont pas utilisés dans les chaînesAfficher l'extrait de code
la source
Nous pouvons utiliser la
_.difference
fonction pour voir s'il y a une différence ou non.J'espère que cela t'aidera.
la source
true
pourconsole.log(isSame([1,2], [2,3,1]));
a
et lesb
variables. Vous n'utilisez ces variables dans la partie, et la première chose que vous faites il y a défaussez ces valeurs chargées à la ligne 2. Je pense que la seule ligne suivante fonctionne exactement le même: . Et le peut également être amélioré en .if-then
return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
<=
===
_.difference
renverra les éléments manquants du 1er argument, mais pas les éléments manquants dans le 2ème. Donc , cela va revenir correctementtrue
lorsque vous répétez les articles le 1er en 2ème:isSame([1, 2, 3], [1, 2, 2])
.Edit: J'ai manqué l'aspect multidimensionnel de cette question, donc je laisse ceci ici au cas où cela aiderait les gens à comparer des tableaux unidimensionnels
C'est une vieille question, mais j'avais des problèmes avec la vitesse d'utilisation de
.sort()
ousortBy()
, alors j'ai utilisé ceci à la place:Il était destiné à échouer rapidement, et pour mes besoins fonctionne bien.
la source
array1.every((str) => array2.includes(str))
Cela devrait suffire. Aussi l'OP voulait utiliser lodash, vous devriez au moins dire pourquoi vous proposez une solution vanillaJS (... maintenant que nous avons tout et inclut ...). Veuillez également fournir un exemple pour appliquer votre fonction au problème fourni (tableaux à 2 dimensions).lodash methods to compare arrays without considering order
voir une alternative en Javascript moderne. La deuxième vérification est nécessaire cararraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
elle retournerait vrai autrement. Je vais le laisser ici, car cela pourrait aider, mais j'apprécie de ne pas avoir répondu à la question