Pourquoi votre code n'a pas fonctionné
En JavaScript, pour les types de données non primitifs tels que les tableaux, ==
y ===
vérifie l'égalité des références (en laissant de côté les conversions de type qui ==
peut effectuer). En d'autres termes, ils vérifient si arr1
y arr2
sont le même objet en mémoire. Dans votre exemple, les deux tableaux ont les mêmes éléments dans le même ordre, mais ne sont pas égaux.
Voici un exemple qui, je l'espère, renforcera l'intuition selon laquelle false
est le bon résultat pour [1] === [1]
:
const x = [1];
const y = [1];
x === y; // false
x[0] = 200;
console.log(x); // "Array [ 200 ]"
console.log(y); // "Array [ 1 ]"
x === y; // false
Solutions
Deux tableaux, arr1
y arr2
ont les mêmes membres si et seulement si :
- Tout dans
arr2
está en arr1
ET
- Tout dans
arr1
está en arr2
Ceci fera donc l'affaire (ES2016) :
const containsAll = (arr1, arr2) =>
arr2.every(arr2Item => arr1.includes(arr2Item))
const sameMembers = (arr1, arr2) =>
containsAll(arr1, arr2) && containsAll(arr2, arr1);
sameMembers(arr1, arr2); // `true`
Cette deuxième solution utilisant Underscore est plus proche de ce que vous essayez de faire :
arr1.sort();
arr2.sort();
_.isEqual(arr1, arr2); // `true`
Il fonctionne parce que isEqual
vérifie l'"égalité profonde", ce qui signifie qu'il ne se limite pas à l'égalité des références et qu'il compare les valeurs.
Une solution à votre troisième question
Vous avez également demandé comment savoir quels éléments de la arr1
ne sont pas contenues dans arr2
.
Ceci fera l'affaire (ES2015) :
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 2, 1];
arr1.filter(arr1Item => !arr2.includes(arr1Item)); // `[4]`
Vous pouvez également utiliser la fonction difference
: méthode :
_.difference(arr1, arr2); // `[4]`
MISE À JOUR
Voir le commentaire de @Redu - ma solution est la suivante sameMembers
mais ce que vous avez peut-être à l'esprit, c'est sameMembersInOrder
également connu sous le nom de deepEquals
.
MISE À JOUR 2
Si vous ne vous souciez pas de l'ordre des membres des tableaux, la fonction Set
peut être une meilleure structure de données que Array
. Voir le Notes du MDN sur la mise en œuvre isSuperset
y difference
en utilisant le dangereux monkey-Parcheando.
Mise à jour 3
Si l'ordre n'a pas d'importance, il est toujours préférable d'utiliser des ensembles. Mais si vous devez utiliser des tableaux, cette solution a une meilleure complexité temporelle que celle que j'ai donnée précédemment :
function sameMembers(arr1, arr2) {
const set1 = new Set(arr1);
const set2 = new Set(arr2);
return arr1.every(item => set2.has(item)) &&
arr2.every(item => set1.has(item))
}