Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

243
Views
js: al insertar una matriz A en una matriz multidimensional B, se sobrescribe la matriz anterior que ya estaba en A

Aquí hay un ejemplo de la consola del navegador.

 a=[[1,2,3],[3,2,1]] b=[] b.push(a) a[0][0]=9 b.push(a)

En ese caso, esperaba que b fuera

 [[[1,2,3],[3,2,1]],[[9,2,3],[3,2,1]]]

Pero será

 [[[9,2,3],[3,2,1]],[[9,2,3],[3,2,1]]]

Adjunto una captura de pantalla para mostrar mejor los resultados en el navegador: consola de navegadores con el mismo código que arriba y salida

¿Alguna idea sobre por qué sucede esto y cómo llegar a mis resultados esperados?

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

En JavaScript, los objetos se pasan por referencia, lo que significa que las "copias" no son copias. Apuntan a la misma dirección en la RAM, por lo que mutar una referencia las muta a todas.

Para aplicar a este caso, si aún no lo sabía, las matrices son tipos especiales de objetos . Para probar esto, puede ejecutar typeof [] en la consola de su navegador. Eso significa que las matrices heredan el comportamiento de "pasar por referencia", lo que significa que si let c = a luego ejecuta c[0] = 1 , a también cambiará y viceversa.

Para resolver este problema, puede usar Array.prototype.slice :

 const a = [[1, 2, 3], [3, 2, 1]]; const b = []; Array.prototype.pushWithoutReference = function(add) { for(let i = 0; i < add.length; i++) { this[this.length] = add[i].slice(0); } } b.pushWithoutReference(a); a[0][0] = 9; b.pushWithoutReference(a);
about 4 years ago · Juan Pablo Isaza Report

0

Para el lenguaje en sí, no hay arreglos multidimensionales, hay otros arreglos dentro de un arreglo. No importa si contiene matrices, objetos simples, funciones o primitivas. Para las primitivas, se copiarán sus valores. De lo contrario, se copiarán las referencias a los objetos.

Puede hacerlo empujando las copias de las matrices internas de la matriz a con la ayuda de map y spread operator(...) .

 var a=[[1,2,3],[3,2,1]]; var b=[]; b.push(a.map(x=>[...x])); a[0][0]=9; b.push(a); console.log(b);

about 4 years ago · Juan Pablo Isaza Report

0

Ok, según todos los comentarios aquí, especialmente el de @code, y también otra publicación ( ¿Cómo paso el valor en lugar de la referencia de una matriz? ) Pude lograr los resultados usando esto:

 b.push([]); for(line of a){ b[b.length-1].push(a.slice(0)); }

EDITAR

La sugerencia de Abhijeet también funciona perfectamente:

 b.push(a.map(x=>[...x]));
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!