Sé que puedo hacerlo usando bucles, pero estoy tratando de encontrar una forma elegante de hacerlo:
Tengo dos matrices:
var array1 = [['a', 'b'], ['b', 'c']];
var array2 = [['b', 'c'], ['a', 'b']];
Quiero usar lodash
para confirmar que las dos matrices anteriores son iguales. Por "lo mismo" quiero decir que no hay ningún elemento 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.
fuente
.sort()
muta y sugiriendo opciones para copiar primero si eso es un problema para el usuario._.isEqual(_.sortBy(array1), _sortBy(array2))
para evitar la mutación.Puedes usar lodashs
xor
para estoSi considera que la matriz [1, 1] es diferente a la matriz [1], entonces puede mejorar el rendimiento un poco así:
fuente
_.xor([3,4], [4,3]).length == 0
te hará verdadero.Se podría utilizar aplanar () y la diferencia () para esto, que funciona bien si no le importa si hay artículos en
array2
que no están enarray1
. Parece que estás preguntando si array1 es un subconjunto de array2 .fuente
Ya hay respuestas aquí, pero aquí está mi implementación JS pura. No estoy seguro de si es óptimo, pero seguro que es transparente, legible y simple.
La razón
contains()
es que sia
contiene todos los elementos deb
, ponerlos en el mismo conjunto no cambiaría el tamaño.Por ejemplo, si
const a = [1,2,3,4]
yconst b = [1,2]
, entoncesnew Set([...a, ...b]) === {1,2,3,4}
. Como puede ver, el conjunto resultante tiene los mismos elementos quea
.A partir de ahí, para hacerlo más conciso, podemos resumirlo en lo siguiente:
fuente
PURE JS (funciona también cuando las matrices y submatrices tienen más de 2 elementos con un orden arbitrario). Si strings contiene
,
use comojoin('-')
carácter de parámetro (puede ser utf) que no se usa en stringsMostrar fragmento de código
fuente
Podemos usar la
_.difference
función para ver si hay alguna diferencia o no.Espero que esto ayude.
fuente
true
paraconsole.log(isSame([1,2], [2,3,1]));
a
yb
variables. Usted sólo se utiliza esas variables dentro de laif-then
parte, y la primera cosa que hacer Hay descartar aquellos valores cargados en la línea 2. Creo que la siguiente línea funcionará exactamente el mismo:return arrayOne.length <= arrayTwo.length && _.isEmpty(_.difference(arrayTwo.sort(), arrayTwo.sort());
. Y<=
también se puede mejorar en===
._.difference
devolverá los elementos faltantes del primer argumento, pero no los elementos faltantes del segundo. Así que esto devolverá de forma incorrectatrue
cuando se repita el 1 de artículos en 2ª:isSame([1, 2, 3], [1, 2, 2])
.Editar: me perdí el aspecto multidimensional de esta pregunta, así que lo dejo aquí en caso de que ayude a las personas a comparar matrices unidimensionales
Es una vieja pregunta, pero estaba teniendo problemas con la velocidad de uso de
.sort()
osortBy()
, así que usé esto en su lugar:Estaba destinado a fallar rápido y, para mis propósitos, funciona bien.
fuente
array1.every((str) => array2.includes(str))
debería ser suficiente. Además, el OP quería usar lodash, al menos debería decir por qué propone una solución vanillaJS (... ahora que tenemos todos e incluye ...). Proporcione también un ejemplo de cómo aplicar su función al problema proporcionado (matrices bidimensionales).lodash methods to compare arrays without considering order
ver una alternativa en el Javascript moderno. La segunda verificación es necesaria ya que, dearraysContainSameStrings(['1', '2', '2'], ['1', '2', '3'])
lo contrario, devolvería verdadero. Lo dejaré aquí, ya que podría ayudar, pero agradezco que no haya respondido a la pregunta