Tengo estas dos matrices: una está llena de información de una solicitud ajax y otra almacena los botones en los que el usuario hace clic. Yo uso este código (lo llené con números de muestra):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
Pero siempre da false
, incluso si las dos matrices son iguales, pero con un nombre diferente. (Verifiqué esto en la consola JS de Chrome). Entonces, ¿hay alguna forma de que pueda saber si estas dos matrices contienen lo mismo? ¿Por qué está dando false
? ¿Cómo puedo saber qué valores de la primera matriz no están en la segunda?
javascript
arrays
compare
Carlos Precioso
fuente
fuente
Respuestas:
Tenga en cuenta que esto no modifica las matrices originales a diferencia de una respuesta anterior.
fuente
Si los elementos de su matriz no son objetos, si son números o cadenas, por ejemplo, puede comparar sus cadenas unidas para ver si tienen los mismos miembros en cualquier orden.
fuente
['a', 'b']
y['a,b']
. Solo recomendaría esta técnica para pequeños guiones desechables.Si desea verificar solo si dos matrices tienen los mismos valores (independientemente del número de ocurrencias y el orden de cada valor), puede hacerlo usando lodash :
¡Corto, sencillo y bonito!
fuente
xor
en los documentos de subrayado? ¿Estás pensando en IODash?¿Tal vez?
fuente
Por qué tu código no funcionó
JavaScript tiene tipos de datos primitivos y tipos de datos no primitivos.
Para los tipos de datos primitivos,
==
y===
comprobación de si las cosas a ambos lados de las barras tienen el mismo valor. Por eso1 === 1
es verdad.Para tipos de datos no primitivos como matrices,
==
y===
verifique la igualdad de referencia. Es decir, comprueban siarr1
yarr2
son el mismo objeto. En su ejemplo, las dos matrices tienen los mismos objetos en el mismo orden, pero no son equivalentes.Soluciones
Dos matrices,
arr1
yarr2
, tienen los mismos miembros si y solo si:arr2
está enarr1
Y
arr1
está enarr2
Entonces esto funcionará (ES2016):
Esta segunda solución que usa Underscore está más cerca de lo que estaba tratando de hacer:
Funciona porque
isEqual
comprueba la "igualdad profunda", lo que significa que busca algo más que la igualdad de referencia y compara valores.Una solución a tu tercera pregunta
También preguntó cómo averiguar qué cosas
arr1
no están incluidasarr2
.Esto lo hará (ES2015):
También puede usar el
difference
método de Underscore :ACTUALIZAR
Vea el comentario de @ Redu: mi solución es para
sameMembers
, pero lo que puede tener en mentesameMembersInOrder
también se conoce comodeepEquals
.ACTUALIZACIÓN 2
Si no le importa el orden de los miembros de las matrices, ES2015 +
Set
puede ser una mejor estructura de datos queArray
. Consulte las notas de MDN sobre cómo implementarisSuperset
ydifference
usar parches de mono peligrosos.fuente
sameMembers([1,1,2],[2,1,2]);
debería devolver falso.sameMembers([1,1,2],[2,1,2])
debería volvertrue
, en mi opinión.sameMembersInOrder([1,1,2],[2,1,2])
AKAdeepEquals([1,1,2],[2,1,2])
debería regresarfalse
.arr1.filter...
solo funcionará para verificar si arr2 tiene todos los elementos de arr1 o no, pero no al revés, lo que también se requiere.Comprobación de igualdad de objetos:
JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
La prueba anterior también funciona con matrices de objetos, en cuyo caso use una función de clasificación como se documenta en http://www.w3schools.com/jsref/jsref_sort.asp
Podría ser suficiente para arreglos pequeños con esquemas JSON planos.
fuente
Nuestro objetivo es básicamente comprobar si 2 matrices son conjuntos iguales. conjunto es el conjunto definido matemáticamente . La clasificación más rápida asintóticamente toma O (nlog (n)) tiempo. Entonces, si ordena una matriz, tomaría al menos O (nlog (n)) tiempo. Pero puede hacer esta tarea más rápido , lo que asintóticamente toma O (n) tiempo (caso promedio, no el peor de los casos) con una estructura de datos de diccionario. En JS, un diccionario es simplemente un objeto con claves y valores.
Tenga en cuenta que esta función trabaja con matrices de tipos primitivos y asume
a1
ya2
son matrices.fuente
¿Qué pasa con esto? ES 2017 supongo:
La primera condición comprueba si ambas matrices tienen la misma longitud y la segunda condición comprueba si la primera matriz es un subconjunto de la segunda matriz. La combinación de estas 2 condiciones debería dar como resultado la comparación de todos los elementos de las 2 matrices independientemente del orden de los elementos.
El código anterior solo funcionará si ambas matrices tienen elementos no duplicados.
fuente
Cuando compara esas dos matrices, está comparando los objetos que representan las matrices, no el contenido.
Tendrás que usar una función para comparar los dos. Puede escribir el suyo propio que simplemente pase por uno y lo compare con el otro después de comprobar que las longitudes son las mismas.
fuente
Solución simple para la igualdad superficial usando ES6:
Crea copias superficiales de cada matriz y las ordena. Luego usa
some()
para recorrer losarr1test
valores, verificando cada valor con el valorarr2test
con el mismo índice. Si todos los valores son iguales,some()
devuelvefalse
y, a su vez,equal
evalúa comotrue
.También podría usar
every()
, pero tendría que recorrer todos los elementos de la matriz para satisfacer untrue
resultado, mientras quesome()
se rescatará tan pronto como encuentre un valor que no sea igual:fuente
Tenía valores enteros simples en un proyecto de juego.
Tenía menos valores en cada matriz, además, necesitaba esa matriz original intacta.
Entonces, hice lo siguiente, funcionó bien. (Código editado para pegar aquí)
Espero que ayude.
fuente
Usando ES6
Usaremos la
equals
función de Ramda , pero en su lugar podemos usar la de Lodash o la de UnderscoreisEqual
:Usando el opporator de propagación, evitamos mutar las matrices originales y mantenemos nuestra función pura.
fuente
Puedes usar
reduce
bucles en lugar de para parecer inteligente, pero a riesgo de que tus compañeros desarrolladores te consideren un sabelotodo.fuente
Si los elementos de la matriz son primitivos (números o caracteres individuales), puede usar una combinación de comparar longitudes y usar conjuntos.
fuente
Ya es 2020, pero noté que la mayoría de las otras soluciones usan sort, O (n * log n), usan bibliotecas o tienen complejidad O (n ^ 2).
Aquí hay una solución Javascript pura con complejidad lineal, O (n):
Pruebas:
fuente
Si está utilizando Prototype Framework, puede usar el método de intersección de una matriz para averiguar si son iguales (independientemente del orden):
fuente
[1,2].intersect([1,2,3]).length === [1,2].length
devuelve verdadero. También debe comparar la longitud de las matrices originales, he editado la publicación para demostrarlo.array1 = [1,1,2]; array2 = [1,1,2];
... la respuesta original no falla para esa entrada._.difference(array1, array2).length;
amablemente revisa esta respuesta
fuente
return
no tendrá ningún efecto. En segundo lugar, debe verificar las matrices ordenadas, ya que[1,2]
y[2,1]
se detectarán como no iguales. En tercer lugar y más importante, esto solo verificará si algún elemento es el mismo. El condicional debería serif (array1!==array2) {return false;}
. ¡Quizás esto pueda ayudarte en el futuro!array1
yarray2
podría cambiarse de nombreelem1
yelem2
. ¡Ambos consejos le ahorrarán muchos dolores de cabeza en el futuro!Respondiendo después de mucho tiempo, pero espero que esto ayude a alguien que busca una solución simple y novatos modernos.
Ahora podemos lograr esto utilizando varias bibliotecas como
lodash
,underscore
, etc. (Estos se convierte en parte del proyecto hoy en día debido a la simplicidad, características múltiples y el uso de alta)Puede usar la intersección de la biblioteca lodash.
Esto funcionará para cualquier tipo de datos.
fuente
Si desea comparar dos matrices y comprobar si algún objeto es el mismo en ambas matrices, funcionará. Ejemplo:
Array1 = [a, b, c, d]
Array2 = [d, e, f, g]
Aquí, 'd' es común en ambos arreglos, por lo que esta función devolverá un valor verdadero.
fuente
Prueba esto
fuente
Tengo otra forma basada en la respuesta aceptada.
fuente
Una función para comparar dos matrices, para comprobar si ambas tienen los mismos elementos. Incluso si están fuera de servicio ...
Es bueno para arreglos simples. [Cadena, Número, Booleano, Nulo, NaN].
No uso .sort (), modifica la matriz original. Algunos dicen que es malo ...
Precaución. Esta función es limitada, no puede comparar objetos "[], {}" o funciones dentro de estos arreglos, los arreglos en sí mismos son objetos.
fuente
Solución simple para comparar las dos matrices:
fuente