Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

132
Vistas
Error de función profundamente igual en Javascript

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!

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

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:

  • Está llamando a 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.
  • Al comparar objetos que no son de matriz, debe recorrer sus propiedades para compararlas.

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í.

about 4 years ago · Juan Pablo Isaza Denunciar

0

¿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; }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda