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

116
Views
por qué obtengo los mismos valores de objetos

Estoy trabajando en un proyecto Angular/firebase

en esta función:

¿Por qué obtengo una matriz con una matriz duplicada? El resultado esperado debe ser una matriz que contenga 2 objetos, cada objeto tiene sus propios valores

Especialmente con el valor dropNumber, obtengo el mismo valor (2) en ambos objetos

 createAutoObject() { this.drops.length = 0; let objectToInsert = { campaignName: '', dropStatus: '', isSeededReceived: false, isLastDrop: false, isDropCompleted: false, dropNumber: 0, dropVolume: '', }; for (let i = 1; i <= 2; i++) { objectToInsert.campaignName = campaignObject.campaignName; objectToInsert.dropNumber = i; objectToInsert.dropVolume = campaignObject.firstDropVolume; this.drops.push(objectToInsert); } return this.drops; }
about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

La razón por la que ambos elementos de su matriz tienen el mismo dropNumber es que ambos apuntan al mismo objeto (objectToInsert).

Después de agregar el primer elemento a la matriz, su ciclo establece dropNumber en un valor mayor, listo para agregar el segundo elemento a la matriz. Pero objectToInsert sigue siendo la misma referencia de objeto, a la que apunta el primer elemento de la matriz.

Para crear un nuevo objeto para cada elemento que está insertando, debe agregar esta línea antes de configurar cualquier propiedad de objeto para ese elemento:

 objectToInsert = new Object();

Luego, cada elemento en su matriz será una referencia de objeto diferente y las propiedades tendrán los valores que espera.

Aquí hay información sobre cómo trabajar con objetos en JavaScript que puede proporcionar más ayuda en esta área.


EDITAR: con el problema básico de JavaScript explicado, ahora pensemos en cómo podría hacerlo mejor en TypeScript con una clase.

Actualmente crea una instancia de objectToInsert como un tipo anónimo, así:

 let objectToInsert = { campaignName: '', . . .

Los tipos anónimos son muy potentes y flexibles, pero aunque se pueden tipificar fuertemente, su anonimato significa que (por definición) no tienen un nombre de tipo que pueda usar para crear instancias de objetos individuales de ese tipo.

Los tipos con nombre, o las clases tradicionales, no tienen esta deficiencia y puede usar esto aquí para su beneficio.

Darle un nombre al tipo, como Campaign :

 class Campaign { campaignName: string = ''; isSeededReceived: boolean = false; dropNumber:number = 0; dropVolume:number = 0; firstDropVolume:number = 0; }

le permite referirse al tipo por su nombre al instanciar objetos:

 for (let i = 1; i <= 2; i++) { let objectToInsert = new Campaign(); objectToInsert.campaignName = campaignObject.campaignName; objectToInsert.dropNumber = i; objectToInsert.dropVolume = campaignObject.firstDropVolume; this.drops.push(objectToInsert); }

La matriz de miembros this.drops , a la que hace referencia pero cuya declaración no se ve aquí, obviamente necesitaría un tratamiento similar. Es decir, tanto la matriz como cualquier otro código que la use también necesitarían actualizarse para pensar en términos de Campaign en lugar de Object . Los detalles de eso dependerán de su diseño, pero deben explicarse por sí mismos.

Aparte del aspecto de autodocumentación de tener un nombre de tipo, el beneficio que esto trae es que su código tiene una mayor seguridad de tipos, ya que ya no está obligado a usar any para agregar objetos a la matriz.

Hay un TypeScript Playground que puede resultarle útil para probar cosas rápidamente en línea.

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!