objetos elementos contar comparar cadenas array agregar javascript arrays compare

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á en arr1

Y

  • Todo en arr1 está en arr2

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.