web-dev-qa-db-fra.com

utilisation de lodash pour comparer des tableaux (existence d'éléments sans ordre)

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.

74
pQuestions123

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.

146
Trott

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
6
Adam Boduch

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);

1
Kamil Kiełczewski

Vous pouvez utiliser lodashs xor pour cela

doArraysContainSameElements = _.xor(arr1, arr2).length === 0
0
Stephan Hoyer

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.

0
Amitesh