javascript - elementos - Cómo saber si dos matrices tienen los mismos valores
contar elementos de un array javascript (10)
Por qué tu código no funcionó
JavaScript tiene tipos de datos primitivos y tipos de datos no primitivos.
Para tipos de datos primitivos, ==
y ===
verifique si las cosas de cada lado de las barras tienen el mismo valor. Es por eso que 1 === 1
es verdadero.
Para tipos de datos no primitivos como matrices, ==
y ===
verifique la igualdad de referencia. Es decir, comprueban si arr1
y arr2
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
y arr2
, tienen los mismos miembros si y solo si:
- Todo en
arr2
está enarr1
Y
- Todo en
arr1
está enarr2
Así que esto hará el truco (ES2016):
const containsAll = (arr1, arr2) =>
arr2.every(arr2Item => arr1.includes(arr2Item))
const sameMembers = (arr1, arr2) =>
containsAll(arr1, arr2) && containsAll(arr2, arr1);
sameMembers(arr1, arr2); // `true`
Esta segunda solución que utiliza Underscore está más cerca de lo que intentabas hacer:
arr1.sort();
arr2.sort();
_.isEqual(arr1, arr2); // `true`
Funciona porque isEqual
comprueba la "igualdad profunda", lo que significa que busca algo más que la igualdad de referencia y compara los valores.
Una solución a su tercera pregunta
También preguntaste cómo averiguar qué cosas en arr1
no están contenidas en arr2
.
Esto lo hará (ES2015):
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 2, 1];
arr1.filter(arr1Item => !arr2.includes(arr1Item)); // `[4]`
También podría usar la difference
de Underscore: método:
_.difference(arr1, arr2); // `[4]`
ACTUALIZAR
Vea el comentario de @ Redu; mi solución es para los sameMembers
, pero lo que puede tener en mente es también los sameMembersInOrder
también conocidos como deepEquals
.
ACTUALIZACIÓN 2
Si no le importa el orden de los miembros de las matrices, ES2015 + ''s Set
puede ser una mejor estructura de datos que Array
. Consulte las notas de MDN sobre cómo implementar isSuperset
y la difference
mediante el uso de parches de mono peligrosos.
Tengo estas dos matrices: una está llena de información de una solicitud de ajax y otra almacena los botones en los que el usuario hace clic. Uso este código (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. (Lo comprobé en la consola JS de Chrome). Entonces, ¿hay alguna forma de que yo sepa si estas dos matrices contienen lo mismo? ¿Por qué es false
? ¿Cómo puedo saber qué valores en la primera matriz no están en la segunda?
Cuando compara esas dos matrices, está comparando los objetos que representan las matrices, no los contenidos.
Tendrá que usar una función para comparar los dos. Podrías escribir el tuyo que simplemente repique uno y lo compare con el otro después de comprobar que las longitudes son las mismas.
Si desea verificar solo si dos matrices tienen los mismos valores (independientemente de la cantidad de ocurrencias y el orden de cada valor), puede hacer esto usando lodash :
_.isEmpty(_.xor(array1, array2))
Corto, simple y bonito!
Si está utilizando Prototype Framework, puede usar el método intersect de una matriz para averiguar si son iguales (independientemente del orden):
var array1 = [1,2];
var array2 = [2,1];
if(array1.intersect(array2).length === array1.length) {
alert("arrays are the same!");
}
Si sus elementos de 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.
var array1= [10, 6, 19, 16, 14, 15, 2, 9, 5, 3, 4, 13, 8, 7, 1, 12, 18, 11, 20, 17];
var array2= [12, 18, 20, 11, 19, 14, 6, 7, 8, 16, 9, 3, 1, 13, 5, 4, 15, 10, 2, 17];
if(array1.sort().join('','')=== array2.sort().join('','')){
alert(''same members'');
}
else alert(''not a match'');
Tenía valores enteros simples en un proyecto de juego
Tenía menos cantidad de valores en cada matriz, también, necesitaba esa matriz original intacta
Entonces, hice lo siguiente, funcionó bien. (Código editado para pegar aquí)
var sourceArray = [1, 2, 3];
var targetArray = [3, 2, 1];
if (sourceArray.length !== targetArray.length) {
// not equal
// did something
return false;
}
var newSortedSourceArray = sourceArray.slice().sort();
var newSortedTargetArray = targetArray.slice().sort();
if (newSortedSourceArray.toString() !== newSortedTargetArray.toString()) { // MAIN CHECK
// not equal
// did something
return false;
}
else {
// equal
// did something
// continued further below
}
// did some more work
return true;
Espero que ayude.
Verificació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 utiliza una función de ordenamiento como se documenta en http://www.w3schools.com/jsref/jsref_sort.asp
Puede ser suficiente para arreglos pequeños con esquemas planos JSON.
amablemente revise esta respuesta
var arr1= [12,18];
var arr2= [12, 18, 20, 11, 19, 14, 6, 7, 8, 16, 9, 3, 1, 13, 5, 4, 15, 10, 2, 17];
for(i=0;i<arr1.length;i++)
{
var array1=arr1[i];
for(j=0;j<arr2.length;j++)
{
var array2=arr2[j];
if(array1==array2)
{
return true;
}
}
}
Array.prototype.compare = function(testArr) {
if (this.length != testArr.length) return false;
for (var i = 0; i < testArr.length; i++) {
if (this[i].compare) { //To test values in nested arrays
if (!this[i].compare(testArr[i])) return false;
}
else if (this[i] !== testArr[i]) return false;
}
return true;
}
var array1 = [2, 4];
var array2 = [4, 2];
if(array1.sort().compare(array2.sort())) {
doSomething();
} else {
doAnotherThing();
}
¿Tal vez?
function arraysEqual(_arr1, _arr2) {
if (!Array.isArray(_arr1) || ! Array.isArray(_arr2) || _arr1.length !== _arr2.length)
return false;
var arr1 = _arr1.concat().sort();
var arr2 = _arr2.concat().sort();
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i])
return false;
}
return true;
}
Tenga en cuenta que esto no modifica las matrices originales a diferencia de la respuesta aceptada.