usando lodash para comparar arrays (existencia de elementos sin orden)


Sé que puedo hacerlo usando bucles, pero estoy tratando de encontrar una manera elegante de hacer esto:

Tengo dos matrices:

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];

Quiero usar lodash para confirmar que los dos son iguales. Por 'lo mismo' quiero decir que no hay ningún elemento en array1 que no esté contenido en array2.

En términos de verificar la igualdad entre estos elementos:

['a', 'b'] == ['b', 'a'] 

O

['a', 'b'] == ['a', 'b'] 

Ambos funcionan ya que las letras siempre estarán en orden.

Gracias de antemano.

Author: Community, 2015-04-29

3 answers

Si ordena la matriz externa, puede usar _.isEqual() dado que la matriz interna ya está ordenada.

var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
_.isEqual(array1.sort(), array2.sort()); //true

Tenga en cuenta que .sort() mutará los arrays. Si eso es un problema para usted, haga una copia primero usando (por ejemplo) .slice() o el operador de propagación (...).

 119
Author: Trott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-22 03:16:10

Por 'lo mismo' quiero decir que no hay ningún elemento en array1 que no esté contenido en array2.

Usted podría utilizar aplanar() y la diferencia (), que funciona bien si no te importa si hay elementos en array2 que no en array1. Parece que estás preguntando ¿es array1 un subconjunto 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
Author: Adam Boduch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-29 18:44:35

Podemos usar la función _.difference para ver si hay alguna diferencia o no.

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

Espero que esto te ayude.

 0
Author: Amitesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-30 11:29:32