Je sais que je peux le faire en utilisant des boucles, mais j'essaie de trouver un moyen élégant 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 sont identiques. Par «le même», je veux dire qu’aucun élément de array1 n’est 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 car les lettres seront toujours en ordre.
Merci d'avance.
Si vous triez le tableau externe, vous pouvez utiliser _.isEqual()
car le tableau interne est déjà trié.
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true
Notez que .sort()
mutera les tableaux. Si cela vous pose un problème, faites d'abord une copie en utilisant (par exemple) .slice()
ou l'opérateur spread (...
).
Ou, comme Daniel Budick le recommande dans un commentaire ci-dessous:
_.isEqual(_.sortBy(array1), _.sortBy(array2))
sortBy()
de Lodash ne mue pas le tableau.
Par "le même", je veux dire qu’il n’existe aucun élément dans array1 qui ne soit contenu dans array2.
Vous pouvez utiliser flatten () et difference () pour cela, ce qui fonctionne bien si vous ne vous souciez pas de savoir s'il existe des éléments dans array2
qui are are in array1
. On dirait que vous demandez array1 est-il un sous-ensemble de array2 ?
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
function isSubset(source, target) {
return !_.difference(_.flatten(source), _.flatten(target)).length;
}
isSubset(array1, array2); // → true
array1.Push('d');
isSubset(array1, array2); // → false
isSubset(array2, array1); // → true
PURE JS (fonctionne également lorsque les tableaux et les sous-réseaux ont plus de 2 éléments avec un ordre arbitraire). Si les chaînes contiennent ,
, utilisez comme caractère join('-')
parametr (peut être utf) qui n'est pas utilisé dans les chaînes.
array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join()
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['b', 'a']];
var r = array1.map(x=>x.sort()).sort().join() === array2.map(x=>x.sort()).sort().join();
console.log(r);
Vous pouvez utiliser lodashs xor
pour cela
doArraysContainSameElements = _.xor(arr1, arr2).length === 0
Nous pouvons utiliser la fonction _.difference
pour voir s'il y a une différence ou non.
function isSame(arrayOne, arrayTwo) {
var a = arrayOne,
b = arrayTwo;
if (arrayOne.length <= arrayTwo.length) {
a = arrayTwo;
b = arrayOne;
}
return _.isEmpty(_.difference(a.sort(), b.sort()));
}
// examples
console.log(isSame([1, 2, 3], [1, 2, 3])); // true
console.log(isSame([1, 2, 4], [1, 2, 3])); // false
console.log(isSame([1, 2], [2, 3, 1])); // false
console.log(isSame([2, 3, 1], [1, 2])); // false
J'espère que cela t'aidera.