Estoy tratando de crear una función para verificar si dos matrices son profundamente iguales entre sí. Un ejemplo sería: [1, 2, { a: "hello" }] y [1, 2, { a: "bye" }] devolverían false.
Este es mi código hasta ahora:
const deeplyEquals = (val1, val2) => { let counter = 0; for (var i = 0; i < val1.length; i++) { if (typeof val1[i] === "object") { deeplyEquals(JSON.stringify(val1[i]), JSON.stringify(val2[i])); } else if (typeof val2[i] === "object") { deeplyEquals(JSON.stringify(val1[i]), JSON.stringify(val2[i])); } else if (val1[i] !== val2[i]) { counter++; } } return counter === 0 ? true : false; };Implementé un contador para que si encontrara un valor en 1 que no fuera igual al mismo valor en 2, se incrementaría. Si el contador no fuera 0, devolvería falso.
Para el ejemplo, el contador aumenta a 7 pero luego, justo al final, cambia a 0 y, por lo tanto, devuelve verdadero en lugar de falso. Estoy seguro de que habría una manera más fácil de hacer esto, pero quería ver si podía hacer que esto funcionara, ya que no estoy seguro de por qué el contador cambia a 0 justo al final.
¡Gracias por cualquier ayuda!
El problema es que el contador es local para cada llamada a deeplyEquals . Hay un counter diferente para cada llamada y, dado que realiza las llamadas de forma recursiva, tiene muchas variables de counter diferentes en la memoria al mismo tiempo.
Si quisiera mantener un counter , tendría que hacer que cada llamada recursiva devuelva el valor del contador (en lugar de una bandera) para que el código que lo llama pueda incrementar su contador tanto.
Pero no hay necesidad en su código. En su lugar, simplemente return false la primera vez que encuentre una diferencia, ya sea durante la llamada en sí o en una de sus llamadas recursivas al verificar el valor de retorno de la llamada recursiva.
Hay otros problemas con el código. Esto es lo que noto improvisadamente:
JSON.stringify , que devuelve una cadena, antes de pasar valores a deeplyEquals , que convertirá matrices y objetos en cadenas. Comparar las cadenas no será confiable (porque los objetos equivalentes pueden tener sus propiedades en diferentes órdenes: JSON.stringify({a:1,b:2}) es la cadena {"a":1,"b":2} , pero JSON.stringify({b:2,a:1}) es la cadena {"b":2,"a":1} ). En su lugar, pase el valor real.typeof x devuelve "object" para matrices y null , así como para objetos que no son matrices; necesita manejar esos tres casos por separado.SO tiene varias preguntas y respuestas sobre cómo realizar verificaciones profundas de igualdad; probablemente sea mejor buscarlos, estudiarlos para asegurarse de que comprende cómo funcionan y continuar desde allí.
¿Por qué no simplemente JSON clasifica ambas matrices y luego compara?
const deepEquals(val1, val2){ let v1 = JSON.stringify(val1); let v2 = JSON.stringify(val2); return v1 === v2; }